From 544d45785585acf6aa69443440ec82159d99f7f6 Mon Sep 17 00:00:00 2001 From: Takafumi Umemoto Date: Tue, 1 Nov 2022 19:42:15 +0900 Subject: [PATCH 001/185] Update to current Devcontainer extension image link (#163557) --- .devcontainer/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.devcontainer/README.md b/.devcontainer/README.md index 47d682f8a8e..133b0c1d64b 100644 --- a/.devcontainer/README.md +++ b/.devcontainer/README.md @@ -18,7 +18,7 @@ If you already have VS Code and Docker installed, you can click the badge above 3. Install [Visual Studio Code Stable](https://code.visualstudio.com/) or [Insiders](https://code.visualstudio.com/insiders/) and the [Dev Containers](https://aka.ms/vscode-remote/download/containers) extension. - ![Image of Dev Containers extension](https://microsoft.github.io/vscode-remote-release/images/remote-containers-extn.png) + ![Image of Dev Containers extension](https://microsoft.github.io/vscode-remote-release/images/dev-containers-extn.png) > **Note:** The Dev Containers extension requires the Visual Studio Code distribution of Code - OSS. See the [FAQ](https://aka.ms/vscode-remote/faq/license) for details. From 0a19bf0e8f3a718c20e94bd518fc1bc94bd85ca8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Tue, 1 Nov 2022 03:53:58 -0700 Subject: [PATCH 002/185] fix inno setup build for non-insider qualities (#165143) fixes #165142 --- build/gulpfile.vscode.win32.js | 8 ++------ build/win32/code.iss | 8 +++++++- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/build/gulpfile.vscode.win32.js b/build/gulpfile.vscode.win32.js index 9117a021b5a..0d3abdae01b 100644 --- a/build/gulpfile.vscode.win32.js +++ b/build/gulpfile.vscode.win32.js @@ -87,7 +87,7 @@ function buildWin32Setup(arch, target) { productJson['target'] = target; fs.writeFileSync(productJsonPath, JSON.stringify(productJson, undefined, '\t')); - const quality = product.quality; + const quality = product.quality || 'dev'; const definitions = { NameLong: product.nameLong, NameShort: product.nameShort, @@ -115,11 +115,7 @@ function buildWin32Setup(arch, target) { }; if (quality === 'insider') { - const appxPackagePrefix = 'code_insiders'; - definitions['AppxPackage'] = `${appxPackagePrefix}_explorer_${arch}.appx`; - if (arch === 'ia32') { - definitions['AppxPackage'] = `${appxPackagePrefix}_explorer_x86.appx`; - } + definitions['AppxPackage'] = `code_insiders_explorer_${arch === 'ia32' ? 'x86' : arch}.appx`; definitions['AppxPackageFullname'] = `Microsoft.${product.win32RegValueName}_1.0.0.0_neutral__8wekyb3d8bbwe`; } diff --git a/build/win32/code.iss b/build/win32/code.iss index 9376add416f..d365ab1cbda 100644 --- a/build/win32/code.iss +++ b/build/win32/code.iss @@ -88,8 +88,10 @@ Name: "{app}"; AfterInstall: DisableAppDirInheritance [Files] Source: "*"; Excludes: "\CodeSignSummary*.md,\tools,\tools\*,\appx,\appx\*,\resources\app\product.json"; DestDir: "{code:GetDestDir}"; Flags: ignoreversion recursesubdirs createallsubdirs Source: "tools\*"; DestDir: "{app}\tools"; Flags: ignoreversion -Source: "appx\*"; DestDir: "{app}\appx"; BeforeInstall: RemoveAppxPackage; AfterInstall: AddAppxPackage; Flags: ignoreversion; Check: IsWindows11OrLater and QualityIsInsiders Source: "{#ProductJsonPath}"; DestDir: "{code:GetDestDir}\resources\app"; Flags: ignoreversion +#ifdef AppxPackageFullname +Source: "appx\*"; DestDir: "{app}\appx"; BeforeInstall: RemoveAppxPackage; AfterInstall: AddAppxPackage; Flags: ignoreversion; Check: IsWindows11OrLater and QualityIsInsiders +#endif [Icons] Name: "{group}\{#NameLong}"; Filename: "{app}\{#ExeBasename}.exe"; AppUserModelID: "{#AppUserId}" @@ -100,8 +102,10 @@ Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\{#NameLong}"; File Filename: "{app}\{#ExeBasename}.exe"; Description: "{cm:LaunchProgram,{#NameLong}}"; Tasks: runcode; Flags: nowait postinstall; Check: ShouldRunAfterUpdate Filename: "{app}\{#ExeBasename}.exe"; Description: "{cm:LaunchProgram,{#NameLong}}"; Flags: nowait postinstall; Check: WizardNotSilent +#ifdef AppxPackageFullname [UninstallRun] Filename: "powershell.exe"; Parameters: "Invoke-Command -ScriptBlock {{Remove-AppxPackage -Package ""{#AppxPackageFullname}""}"; Check: IsWindows11OrLater and QualityIsInsiders; Flags: shellexec waituntilterminated runhidden +#endif [Registry] #if "user" == InstallTarget @@ -1418,6 +1422,7 @@ begin Result := False; end; +#ifdef AppxPackageFullname procedure AddAppxPackage(); var AddAppxPackageResultCode: Integer; @@ -1440,6 +1445,7 @@ begin RegDeleteKeyIncludingSubkeys({#EnvironmentRootKey}, 'Software\Classes\{#RegValueName}ContextMenu'); end; end; +#endif procedure CurStepChanged(CurStep: TSetupStep); var From be022daa1af42dcc6edc257df152a6fd29325c32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Tue, 1 Nov 2022 04:15:50 -0700 Subject: [PATCH 003/185] =?UTF-8?q?add=20=F0=9F=9A=80=20build=20tag=20to?= =?UTF-8?q?=20builds=20which=20go=20through=20publishing=20(#165145)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build/azure-pipelines/product-publish.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/build/azure-pipelines/product-publish.yml b/build/azure-pipelines/product-publish.yml index 80076fd666d..08674e71859 100644 --- a/build/azure-pipelines/product-publish.yml +++ b/build/azure-pipelines/product-publish.yml @@ -10,6 +10,10 @@ steps: KeyVaultName: vscode SecretsFilter: "github-distro-mixin-password" + # allow-any-unicode-next-line + - pwsh: Write-Host "##vso[build.addbuildtag]🚀" + displayName: Add build tag + - script: | set -e cat << EOF > ~/.netrc From 18f1101f70156a9fd6f83382fce1693fca527a2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Tue, 1 Nov 2022 06:26:44 -0700 Subject: [PATCH 004/185] skip flaky test (#165150) * skip flaky test related to #165149 * skip the entire suite --- .../src/singlefolder-tests/notebook.editor.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/notebook.editor.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/notebook.editor.test.ts index c00c2e45ae6..f182631930f 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/notebook.editor.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/notebook.editor.test.ts @@ -7,7 +7,7 @@ import * as assert from 'assert'; import * as vscode from 'vscode'; import * as utils from '../utils'; -(vscode.env.uiKind === vscode.UIKind.Web ? suite.skip : suite)('Notebook Editor', function () { +(vscode.env.uiKind === vscode.UIKind.Web ? suite.skip : suite.skip)('Notebook Editor', function () { const contentSerializer = new class implements vscode.NotebookSerializer { deserializeNotebook() { From a2e787228f6105d2ac3a6e249684b51b4b52fe4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Tue, 1 Nov 2022 07:12:43 -0700 Subject: [PATCH 005/185] smoketests should not fail by bumping version in package.json (#165132) related to #165118 --- test/smoke/src/main.ts | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/test/smoke/src/main.ts b/test/smoke/src/main.ts index e2657a9e4df..ef9e04f39bf 100644 --- a/test/smoke/src/main.ts +++ b/test/smoke/src/main.ts @@ -263,30 +263,31 @@ async function setupRepository(): Promise { async function ensureStableCode(): Promise { let stableCodePath = opts['stable-build']; if (!stableCodePath) { - const { major, minor } = parseVersion(version!); - const majorMinorVersion = `${major}.${minor - 1}`; - const versionsReq = await retry(() => measureAndLog(() => fetch('https://update.code.visualstudio.com/api/releases/stable', { headers: { 'x-api-version': '2' } }), 'versionReq', logger), 1000, 20); + const current = parseVersion(version!); + const versionsReq = await retry(() => measureAndLog(() => fetch('https://update.code.visualstudio.com/api/releases/stable'), 'versionReq', logger), 1000, 20); if (!versionsReq.ok) { throw new Error('Could not fetch releases from update server'); } - const versions: { version: string }[] = await measureAndLog(() => versionsReq.json(), 'versionReq.json()', logger); - const prefix = `${majorMinorVersion}.`; - const previousVersion = versions.find(v => v.version.startsWith(prefix)); + const versions: string[] = await measureAndLog(() => versionsReq.json(), 'versionReq.json()', logger); + const stableVersion = versions.find(raw => { + const version = parseVersion(raw); + return version.major < current.major || (version.major === current.major && version.minor < current.minor); + }); - if (!previousVersion) { - throw new Error(`Could not find suitable stable version ${majorMinorVersion}`); + if (!stableVersion) { + throw new Error(`Could not find suitable stable version for ${version}`); } - logger.log(`Found VS Code v${version}, downloading previous VS Code version ${previousVersion.version}...`); + logger.log(`Found VS Code v${version}, downloading previous VS Code version ${stableVersion}...`); let lastProgressMessage: string | undefined = undefined; let lastProgressReportedAt = 0; const stableCodeDestination = path.join(testDataPath, 's'); const stableCodeExecutable = await retry(() => measureAndLog(() => vscodetest.download({ cachePath: stableCodeDestination, - version: previousVersion.version, + version: stableVersion, extractSync: true, reporter: { report: report => { From 04a05581d89aff995688fdcbdc202ecfa6cb97de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Tue, 1 Nov 2022 07:13:58 -0700 Subject: [PATCH 006/185] bump version (#165133) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ab5fa294f2b..c5892334cf2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "code-oss-dev", - "version": "1.73.0", + "version": "1.74.0", "distro": "51e5bb745ed01b333d96df102d750c9ec33ffe23", "author": { "name": "Microsoft Corporation" From ceaf7a431bdad3d05c33c8d711a16d1be6f8db00 Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Tue, 1 Nov 2022 15:21:34 +0100 Subject: [PATCH 007/185] Update grammars (#165100) --- extensions/cpp/cgmanifest.json | 4 +- .../cpp.embedded.macro.tmLanguage.json | 2546 ++------ extensions/cpp/syntaxes/cpp.tmLanguage.json | 5180 +++-------------- extensions/razor/cgmanifest.json | 2 +- .../razor/syntaxes/cshtml.tmLanguage.json | 4 +- extensions/sql/cgmanifest.json | 4 +- extensions/sql/syntaxes/sql.tmLanguage.json | 178 +- .../test/colorize-results/test-78769_cpp.json | 4 +- .../test/colorize-results/test_cc.json | 2 +- .../test/colorize-results/test_cpp.json | 4 +- .../test/colorize-results/test_sql.json | 80 +- 11 files changed, 1383 insertions(+), 6625 deletions(-) diff --git a/extensions/cpp/cgmanifest.json b/extensions/cpp/cgmanifest.json index 92d0016b0e6..77eda2c94e3 100644 --- a/extensions/cpp/cgmanifest.json +++ b/extensions/cpp/cgmanifest.json @@ -6,11 +6,11 @@ "git": { "name": "jeff-hykin/better-cpp-syntax", "repositoryUrl": "https://github.com/jeff-hykin/better-cpp-syntax", - "commitHash": "32be139c7d3cdf07195af4b3a5c639ebf4e3b356" + "commitHash": "1866de22c09781cbceacc2c98063f7bf77b1ca62" } }, "license": "MIT", - "version": "1.15.23", + "version": "1.16.1", "description": "The original JSON grammars were derived from https://github.com/atom/language-c which was originally converted from the C TextMate bundle https://github.com/textmate/c.tmbundle." }, { diff --git a/extensions/cpp/syntaxes/cpp.embedded.macro.tmLanguage.json b/extensions/cpp/syntaxes/cpp.embedded.macro.tmLanguage.json index f109e7ea778..c6871783cca 100644 --- a/extensions/cpp/syntaxes/cpp.embedded.macro.tmLanguage.json +++ b/extensions/cpp/syntaxes/cpp.embedded.macro.tmLanguage.json @@ -4,7 +4,7 @@ "If you want to provide a fix or improvement, please create a pull request against the original repository.", "Once accepted there, we are happy to receive an update request." ], - "version": "https://github.com/jeff-hykin/better-cpp-syntax/commit/32be139c7d3cdf07195af4b3a5c639ebf4e3b356", + "version": "https://github.com/jeff-hykin/better-cpp-syntax/commit/1866de22c09781cbceacc2c98063f7bf77b1ca62", "name": "C++", "scopeName": "source.cpp.embedded.macro", "patterns": [ @@ -74,6 +74,9 @@ { "include": "#template_definition" }, + { + "include": "source.cpp#template_explicit_instantiation" + }, { "include": "source.cpp#access_control_keywords" }, @@ -159,7 +162,7 @@ ] }, "alignas_operator": { - "begin": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(\\()", + "begin": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(\\()", + "begin": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(?:\\n)|$)", + "match": "^((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(?:(?:\\n)|$)", "captures": { "1": { "patterns": [ @@ -285,16 +270,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } }, @@ -302,7 +278,7 @@ "include": "#comments" }, { - "begin": "((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))\\(", + "begin": "((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))\\(", "end": "\\)|(?=(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))\\]", + "match": "\\[((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))\\]", "captures": { "1": { "patterns": [ @@ -415,16 +382,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "5": { "name": "variable.other.asm.label.cpp" @@ -443,16 +401,7 @@ "name": "comment.block.cpp" }, "9": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } }, @@ -550,7 +499,7 @@ ] }, "case_statement": { - "begin": "((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(?={)|(?:((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\s*\\(\\s*\\(.*?\\)\\s*\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))?((?:(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*+)?(?:((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(:(?!:)))?)", + "begin": "((?|\\?\\?>)(?:(?:\\s)+)?(;)|(;))|(?=[;>\\[\\]=]))|(?=(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))", + "match": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))?(?=:|{|$)", + "match": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?:(?:(?:constexpr)|(?:consteval)|(?:explicit)|(?:mutable)|(?:virtual)|(?:inline)|(?:friend))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*)((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?:__cdecl|__clrcall|__stdcall|__fastcall|__thiscall|__vectorcall)?)((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?|\\?\\?>)|(?=[;>\\[\\]=]))|(?=(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(default)|(delete))", + "match": "(\\=)((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(?:(default)|(delete))", "captures": { "1": { "name": "keyword.operator.assignment.cpp" @@ -1349,16 +1190,7 @@ "name": "comment.block.cpp" }, "5": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "6": { "name": "keyword.other.default.function.cpp keyword.other.default.constructor.cpp" @@ -1469,12 +1301,7 @@ ] }, { - "match": "((?:(?:final)|(?:override)))+", - "captures": { - "1": { - "name": "keyword.operator.$1.cpp" - } - } + "include": "source.cpp#qualifiers_and_specifiers_post_parameters" }, { "include": "$self" @@ -1512,7 +1339,7 @@ ] }, "constructor_root": { - "begin": "\\s*+((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?:__cdecl|__clrcall|__stdcall|__fastcall|__thiscall|__vectorcall)?)((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?:::)?(?:(?!\\b(?:__has_cpp_attribute|reinterpret_cast|atomic_noexcept|atomic_commit|atomic_cancel|__has_include|thread_local|dynamic_cast|synchronized|static_cast|const_cast|consteval|co_return|protected|constinit|constexpr|co_return|consteval|namespace|constexpr|constexpr|co_await|explicit|volatile|noexcept|co_yield|noexcept|noexcept|requires|typename|decltype|operator|template|continue|co_await|co_yield|volatile|register|restrict|reflexpr|mutable|alignof|include|private|defined|typedef|_Pragma|__asm__|concept|mutable|warning|default|virtual|alignas|public|sizeof|delete|not_eq|bitand|and_eq|xor_eq|typeid|switch|return|struct|static|extern|inline|friend|ifndef|define|pragma|export|import|module|catch|throw|const|or_eq|compl|while|ifdef|const|bitor|union|class|undef|error|break|using|endif|goto|line|enum|this|case|else|elif|else|not|try|for|asm|and|xor|new|do|if|or|if)\\b)(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<12>?)+>)(?:\\s)*+)?::)*+)(((?>(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))::((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))\\14((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?=\\())", + "begin": "\\s*+((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))((?:__cdecl|__clrcall|__stdcall|__fastcall|__thiscall|__vectorcall)?)((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))((?:::)?(?:(?!\\b(?:__has_cpp_attribute|reinterpret_cast|atomic_noexcept|atomic_commit|atomic_cancel|__has_include|thread_local|dynamic_cast|synchronized|static_cast|const_cast|consteval|co_return|protected|constinit|constexpr|co_return|consteval|namespace|constexpr|constexpr|co_await|explicit|volatile|noexcept|co_yield|noexcept|noexcept|requires|typename|decltype|operator|template|continue|co_await|co_yield|volatile|register|restrict|reflexpr|mutable|alignof|include|private|defined|typedef|_Pragma|__asm__|concept|mutable|warning|default|virtual|alignas|public|sizeof|delete|not_eq|bitand|and_eq|xor_eq|typeid|switch|return|struct|static|extern|inline|friend|ifndef|define|pragma|export|import|module|catch|throw|const|or_eq|compl|while|ifdef|const|bitor|union|class|undef|error|break|using|endif|goto|line|enum|this|case|else|elif|else|not|try|for|asm|and|xor|new|do|if|or|if)\\b)(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<12>?)+>)(?:\\s)*+)?::)*+)(((?>(?|\\?\\?>)|(?=[;>\\[\\]=]))|(?=(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(default)|(delete))", + "match": "(\\=)((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(?:(default)|(delete))", "captures": { "1": { "name": "keyword.operator.assignment.cpp" @@ -1724,16 +1506,7 @@ "name": "comment.block.cpp" }, "5": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "6": { "name": "keyword.other.default.function.cpp keyword.other.default.constructor.cpp" @@ -1844,12 +1617,7 @@ ] }, { - "match": "((?:(?:final)|(?:override)))+", - "captures": { - "1": { - "name": "keyword.operator.$1.cpp" - } - } + "include": "source.cpp#qualifiers_and_specifiers_post_parameters" }, { "include": "$self" @@ -1951,7 +1719,7 @@ ] }, "curly_initializer": { - "begin": "(\\s*+((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\s*\\(\\s*\\(.*?\\)\\s*\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(?:(?:(?:unsigned)|(?:signed)|(?:short)|(?:long))|(?:(?:struct)|(?:class)|(?:union)|(?:enum)))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*((?:::)?(?:(?!\\b(?:__has_cpp_attribute|reinterpret_cast|atomic_noexcept|atomic_commit|atomic_cancel|__has_include|thread_local|dynamic_cast|synchronized|static_cast|const_cast|consteval|co_return|protected|constinit|constexpr|co_return|consteval|namespace|constexpr|constexpr|co_await|explicit|volatile|noexcept|co_yield|noexcept|noexcept|requires|typename|decltype|operator|template|continue|co_await|co_yield|volatile|register|restrict|reflexpr|mutable|alignof|include|private|defined|typedef|_Pragma|__asm__|concept|mutable|warning|default|virtual|alignas|public|sizeof|delete|not_eq|bitand|and_eq|xor_eq|typeid|switch|return|struct|static|extern|inline|friend|ifndef|define|pragma|export|import|module|catch|throw|const|or_eq|compl|while|ifdef|const|bitor|union|class|undef|error|break|using|endif|goto|line|enum|this|case|else|elif|else|not|try|for|asm|and|xor|new|do|if|or|if)\\b)(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<18>?)+>)(?:\\s)*+)?::)*+)?((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?!(?:(?:transaction_safe_dynamic)|(?:__has_cpp_attribute)|(?:reinterpret_cast)|(?:transaction_safe)|(?:atomic_noexcept)|(?:atomic_commit)|(?:__has_include)|(?:atomic_cancel)|(?:synchronized)|(?:thread_local)|(?:dynamic_cast)|(?:static_cast)|(?:const_cast)|(?:constexpr)|(?:co_return)|(?:constinit)|(?:namespace)|(?:protected)|(?:consteval)|(?:constexpr)|(?:constexpr)|(?:co_return)|(?:consteval)|(?:co_await)|(?:continue)|(?:template)|(?:reflexpr)|(?:volatile)|(?:register)|(?:co_await)|(?:co_yield)|(?:restrict)|(?:noexcept)|(?:volatile)|(?:override)|(?:explicit)|(?:decltype)|(?:operator)|(?:noexcept)|(?:noexcept)|(?:typename)|(?:requires)|(?:co_yield)|(?:nullptr)|(?:alignof)|(?:alignas)|(?:default)|(?:mutable)|(?:virtual)|(?:mutable)|(?:private)|(?:include)|(?:warning)|(?:_Pragma)|(?:defined)|(?:typedef)|(?:__asm__)|(?:concept)|(?:define)|(?:module)|(?:sizeof)|(?:switch)|(?:delete)|(?:pragma)|(?:and_eq)|(?:inline)|(?:xor_eq)|(?:typeid)|(?:import)|(?:extern)|(?:public)|(?:bitand)|(?:static)|(?:export)|(?:return)|(?:friend)|(?:ifndef)|(?:not_eq)|(?:false)|(?:final)|(?:break)|(?:const)|(?:catch)|(?:endif)|(?:ifdef)|(?:undef)|(?:error)|(?:audit)|(?:while)|(?:using)|(?:axiom)|(?:or_eq)|(?:compl)|(?:throw)|(?:bitor)|(?:const)|(?:line)|(?:case)|(?:else)|(?:this)|(?:true)|(?:goto)|(?:else)|(?:NULL)|(?:elif)|(?:new)|(?:asm)|(?:xor)|(?:and)|(?:try)|(?:not)|(?:for)|(?:do)|(?:if)|(?:or)|(?:if))\\b)(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\b((?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<18>?)+>)?(?![\\w<:.]))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(\\{)", + "begin": "(\\s*+((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\s*\\(\\s*\\(.*?\\)\\s*\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(?:(?:(?:(?:unsigned)|(?:signed)|(?:short)|(?:long))|(?:(?:struct)|(?:class)|(?:union)|(?:enum)))((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z))))*(?:((?:::)?(?:(?!\\b(?:__has_cpp_attribute|reinterpret_cast|atomic_noexcept|atomic_commit|atomic_cancel|__has_include|thread_local|dynamic_cast|synchronized|static_cast|const_cast|consteval|co_return|protected|constinit|constexpr|co_return|consteval|namespace|constexpr|constexpr|co_await|explicit|volatile|noexcept|co_yield|noexcept|noexcept|requires|typename|decltype|operator|template|continue|co_await|co_yield|volatile|register|restrict|reflexpr|mutable|alignof|include|private|defined|typedef|_Pragma|__asm__|concept|mutable|warning|default|virtual|alignas|public|sizeof|delete|not_eq|bitand|and_eq|xor_eq|typeid|switch|return|struct|static|extern|inline|friend|ifndef|define|pragma|export|import|module|catch|throw|const|or_eq|compl|while|ifdef|const|bitor|union|class|undef|error|break|using|endif|goto|line|enum|this|case|else|elif|else|not|try|for|asm|and|xor|new|do|if|or|if)\\b)(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<18>?)+>)(?:\\s)*+)?::)*+)((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z))))?(?!(?:(?:transaction_safe_dynamic)|(?:__has_cpp_attribute)|(?:reinterpret_cast)|(?:transaction_safe)|(?:atomic_noexcept)|(?:atomic_commit)|(?:__has_include)|(?:atomic_cancel)|(?:synchronized)|(?:thread_local)|(?:dynamic_cast)|(?:static_cast)|(?:const_cast)|(?:constexpr)|(?:co_return)|(?:constinit)|(?:namespace)|(?:protected)|(?:consteval)|(?:constexpr)|(?:constexpr)|(?:co_return)|(?:consteval)|(?:co_await)|(?:continue)|(?:template)|(?:reflexpr)|(?:volatile)|(?:register)|(?:co_await)|(?:co_yield)|(?:restrict)|(?:noexcept)|(?:volatile)|(?:override)|(?:explicit)|(?:decltype)|(?:operator)|(?:noexcept)|(?:noexcept)|(?:typename)|(?:requires)|(?:co_yield)|(?:nullptr)|(?:alignof)|(?:alignas)|(?:default)|(?:mutable)|(?:virtual)|(?:mutable)|(?:private)|(?:include)|(?:warning)|(?:_Pragma)|(?:defined)|(?:typedef)|(?:__asm__)|(?:concept)|(?:define)|(?:module)|(?:sizeof)|(?:switch)|(?:delete)|(?:pragma)|(?:and_eq)|(?:inline)|(?:xor_eq)|(?:typeid)|(?:import)|(?:extern)|(?:public)|(?:bitand)|(?:static)|(?:export)|(?:return)|(?:friend)|(?:ifndef)|(?:not_eq)|(?:false)|(?:final)|(?:break)|(?:const)|(?:catch)|(?:endif)|(?:ifdef)|(?:undef)|(?:error)|(?:audit)|(?:while)|(?:using)|(?:axiom)|(?:or_eq)|(?:compl)|(?:throw)|(?:bitor)|(?:const)|(?:line)|(?:case)|(?:else)|(?:this)|(?:true)|(?:goto)|(?:else)|(?:NULL)|(?:elif)|(?:new)|(?:asm)|(?:xor)|(?:and)|(?:try)|(?:not)|(?:for)|(?:do)|(?:if)|(?:or)|(?:if))\\b)(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\b((?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<18>?)+>)?(?![\\w<:.]))((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(\\{)", "end": "\\}|(?=(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(\\()", + "begin": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(\\()", + "begin": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?:__cdecl|__clrcall|__stdcall|__fastcall|__thiscall|__vectorcall)?)((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?:(?:(?:constexpr)|(?:consteval)|(?:explicit)|(?:mutable)|(?:virtual)|(?:inline)|(?:friend))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*)(~(?|\\?\\?>)|(?=[;>\\[\\]=]))|(?=(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(default)|(delete))", + "match": "(\\=)((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(?:(default)|(delete))", "captures": { "1": { "name": "keyword.operator.assignment.cpp" @@ -2461,16 +2130,7 @@ "name": "comment.block.cpp" }, "5": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "6": { "name": "keyword.other.default.function.cpp keyword.other.default.constructor.cpp keyword.other.default.destructor.cpp" @@ -2497,12 +2157,7 @@ "patterns": [] }, { - "match": "((?:(?:final)|(?:override)))+", - "captures": { - "1": { - "name": "keyword.operator.wordlike.cpp keyword.operator.$1.cpp" - } - } + "include": "source.cpp#qualifiers_and_specifiers_post_parameters" }, { "include": "$self" @@ -2540,7 +2195,7 @@ ] }, "destructor_root": { - "begin": "((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?:__cdecl|__clrcall|__stdcall|__fastcall|__thiscall|__vectorcall)?)((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?:::)?(?:(?!\\b(?:__has_cpp_attribute|reinterpret_cast|atomic_noexcept|atomic_commit|atomic_cancel|__has_include|thread_local|dynamic_cast|synchronized|static_cast|const_cast|consteval|co_return|protected|constinit|constexpr|co_return|consteval|namespace|constexpr|constexpr|co_await|explicit|volatile|noexcept|co_yield|noexcept|noexcept|requires|typename|decltype|operator|template|continue|co_await|co_yield|volatile|register|restrict|reflexpr|mutable|alignof|include|private|defined|typedef|_Pragma|__asm__|concept|mutable|warning|default|virtual|alignas|public|sizeof|delete|not_eq|bitand|and_eq|xor_eq|typeid|switch|return|struct|static|extern|inline|friend|ifndef|define|pragma|export|import|module|catch|throw|const|or_eq|compl|while|ifdef|const|bitor|union|class|undef|error|break|using|endif|goto|line|enum|this|case|else|elif|else|not|try|for|asm|and|xor|new|do|if|or|if)\\b)(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<12>?)+>)(?:\\s)*+)?::)*+)(((?>(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))::((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))~\\14((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?=\\())", + "begin": "((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))((?:__cdecl|__clrcall|__stdcall|__fastcall|__thiscall|__vectorcall)?)((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))((?:::)?(?:(?!\\b(?:__has_cpp_attribute|reinterpret_cast|atomic_noexcept|atomic_commit|atomic_cancel|__has_include|thread_local|dynamic_cast|synchronized|static_cast|const_cast|consteval|co_return|protected|constinit|constexpr|co_return|consteval|namespace|constexpr|constexpr|co_await|explicit|volatile|noexcept|co_yield|noexcept|noexcept|requires|typename|decltype|operator|template|continue|co_await|co_yield|volatile|register|restrict|reflexpr|mutable|alignof|include|private|defined|typedef|_Pragma|__asm__|concept|mutable|warning|default|virtual|alignas|public|sizeof|delete|not_eq|bitand|and_eq|xor_eq|typeid|switch|return|struct|static|extern|inline|friend|ifndef|define|pragma|export|import|module|catch|throw|const|or_eq|compl|while|ifdef|const|bitor|union|class|undef|error|break|using|endif|goto|line|enum|this|case|else|elif|else|not|try|for|asm|and|xor|new|do|if|or|if)\\b)(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<12>?)+>)(?:\\s)*+)?::)*+)(((?>(?|\\?\\?>)|(?=[;>\\[\\]=]))|(?=(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(default)|(delete))", + "match": "(\\=)((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(?:(default)|(delete))", "captures": { "1": { "name": "keyword.operator.assignment.cpp" @@ -2752,16 +2362,7 @@ "name": "comment.block.cpp" }, "5": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "6": { "name": "keyword.other.default.function.cpp keyword.other.default.constructor.cpp keyword.other.default.destructor.cpp" @@ -2788,12 +2389,7 @@ "patterns": [] }, { - "match": "((?:(?:final)|(?:override)))+", - "captures": { - "1": { - "name": "keyword.operator.wordlike.cpp keyword.operator.$1.cpp" - } - } + "include": "source.cpp#qualifiers_and_specifiers_post_parameters" }, { "include": "$self" @@ -2831,7 +2427,7 @@ ] }, "diagnostic": { - "begin": "(^((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(#)(?:(?:\\s)+)?((?:error|warning)))\\b(?:(?:\\s)+)?", + "begin": "(^((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(#)(?:(?:\\s)+)?((?:error|warning)))\\b(?:(?:\\s)+)?", "end": "(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(extern)(?=\\s*\\\")", + "begin": "((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(extern)(?=\\s*\\\")", "end": "(?:(?:(?<=\\}|%>|\\?\\?>)(?:(?:\\s)+)?(;)|(;))|(?=[;>\\[\\]=]))|(?=(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<11>?)+>)(?:\\s)*+)?::)*\\s*+)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(((?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<11>?)+>)(?:\\s)*+)?(\\()", + "begin": "((::)?(?:(?!\\b(?:__has_cpp_attribute|reinterpret_cast|atomic_noexcept|atomic_commit|atomic_cancel|__has_include|thread_local|dynamic_cast|synchronized|static_cast|const_cast|consteval|co_return|protected|constinit|constexpr|co_return|consteval|namespace|constexpr|constexpr|co_await|explicit|volatile|noexcept|co_yield|noexcept|noexcept|requires|typename|decltype|operator|template|continue|co_await|co_yield|volatile|register|restrict|reflexpr|mutable|alignof|include|private|defined|typedef|_Pragma|__asm__|concept|mutable|warning|default|virtual|alignas|public|sizeof|delete|not_eq|bitand|and_eq|xor_eq|typeid|switch|return|struct|static|extern|inline|friend|ifndef|define|pragma|export|import|module|catch|throw|const|or_eq|compl|while|ifdef|const|bitor|union|class|undef|error|break|using|endif|goto|line|enum|this|case|else|elif|else|not|try|for|asm|and|xor|new|do|if|or|if)\\b)(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<11>?)+>)(?:\\s)*+)?::)*\\s*+)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<11>?)+>)(?:\\s)*+)?(\\()", "end": "\\)|(?=(?))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))?((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\s*\\(\\s*\\(.*?\\)\\s*\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?((?:((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*)(\\s*+((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\s*\\(\\s*\\(.*?\\)\\s*\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(?:(?:(?:unsigned)|(?:signed)|(?:short)|(?:long))|(?:(?:struct)|(?:class)|(?:union)|(?:enum)))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*((?:::)?(?:(?!\\b(?:__has_cpp_attribute|reinterpret_cast|atomic_noexcept|atomic_commit|atomic_cancel|__has_include|thread_local|dynamic_cast|synchronized|static_cast|const_cast|consteval|co_return|protected|constinit|constexpr|co_return|consteval|namespace|constexpr|constexpr|co_await|explicit|volatile|noexcept|co_yield|noexcept|noexcept|requires|typename|decltype|operator|template|continue|co_await|co_yield|volatile|register|restrict|reflexpr|mutable|alignof|include|private|defined|typedef|_Pragma|__asm__|concept|mutable|warning|default|virtual|alignas|public|sizeof|delete|not_eq|bitand|and_eq|xor_eq|typeid|switch|return|struct|static|extern|inline|friend|ifndef|define|pragma|export|import|module|catch|throw|const|or_eq|compl|while|ifdef|const|bitor|union|class|undef|error|break|using|endif|goto|line|enum|this|case|else|elif|else|not|try|for|asm|and|xor|new|do|if|or|if)\\b)(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<60>?)+>)(?:\\s)*+)?::)*+)?((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?!(?:(?:transaction_safe_dynamic)|(?:__has_cpp_attribute)|(?:reinterpret_cast)|(?:transaction_safe)|(?:atomic_noexcept)|(?:atomic_commit)|(?:__has_include)|(?:atomic_cancel)|(?:synchronized)|(?:thread_local)|(?:dynamic_cast)|(?:static_cast)|(?:const_cast)|(?:constexpr)|(?:co_return)|(?:constinit)|(?:namespace)|(?:protected)|(?:consteval)|(?:constexpr)|(?:constexpr)|(?:co_return)|(?:consteval)|(?:co_await)|(?:continue)|(?:template)|(?:reflexpr)|(?:volatile)|(?:register)|(?:co_await)|(?:co_yield)|(?:restrict)|(?:noexcept)|(?:volatile)|(?:override)|(?:explicit)|(?:decltype)|(?:operator)|(?:noexcept)|(?:noexcept)|(?:typename)|(?:requires)|(?:co_yield)|(?:nullptr)|(?:alignof)|(?:alignas)|(?:default)|(?:mutable)|(?:virtual)|(?:mutable)|(?:private)|(?:include)|(?:warning)|(?:_Pragma)|(?:defined)|(?:typedef)|(?:__asm__)|(?:concept)|(?:define)|(?:module)|(?:sizeof)|(?:switch)|(?:delete)|(?:pragma)|(?:and_eq)|(?:inline)|(?:xor_eq)|(?:typeid)|(?:import)|(?:extern)|(?:public)|(?:bitand)|(?:static)|(?:export)|(?:return)|(?:friend)|(?:ifndef)|(?:not_eq)|(?:false)|(?:final)|(?:break)|(?:const)|(?:catch)|(?:endif)|(?:ifdef)|(?:undef)|(?:error)|(?:audit)|(?:while)|(?:using)|(?:axiom)|(?:or_eq)|(?:compl)|(?:throw)|(?:bitor)|(?:const)|(?:line)|(?:case)|(?:else)|(?:this)|(?:true)|(?:goto)|(?:else)|(?:NULL)|(?:elif)|(?:new)|(?:asm)|(?:xor)|(?:and)|(?:try)|(?:not)|(?:for)|(?:do)|(?:if)|(?:or)|(?:if))\\b)(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\b((?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<60>?)+>)?(?![\\w<:.]))(((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))?(?:(?:&|(?:\\*))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*(?:&|(?:\\*)))?((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?:__cdecl|__clrcall|__stdcall|__fastcall|__thiscall|__vectorcall)?)((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((::)?(?:(?!\\b(?:__has_cpp_attribute|reinterpret_cast|atomic_noexcept|atomic_commit|atomic_cancel|__has_include|thread_local|dynamic_cast|synchronized|static_cast|const_cast|consteval|co_return|protected|constinit|constexpr|co_return|consteval|namespace|constexpr|constexpr|co_await|explicit|volatile|noexcept|co_yield|noexcept|noexcept|requires|typename|decltype|operator|template|continue|co_await|co_yield|volatile|register|restrict|reflexpr|mutable|alignof|include|private|defined|typedef|_Pragma|__asm__|concept|mutable|warning|default|virtual|alignas|public|sizeof|delete|not_eq|bitand|and_eq|xor_eq|typeid|switch|return|struct|static|extern|inline|friend|ifndef|define|pragma|export|import|module|catch|throw|const|or_eq|compl|while|ifdef|const|bitor|union|class|undef|error|break|using|endif|goto|line|enum|this|case|else|elif|else|not|try|for|asm|and|xor|new|do|if|or|if)\\b)(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<60>?)+>)(?:\\s)*+)?::)*\\s*+)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?=\\()", + "begin": "(?:(?:^|\\G|(?<=;|\\}))|(?<=>|\\*\\/))\\s*+(?:((?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<56>?)+>)(?:\\s)*+)?::)*+)((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z))))?(?!(?:(?:transaction_safe_dynamic)|(?:__has_cpp_attribute)|(?:reinterpret_cast)|(?:transaction_safe)|(?:atomic_noexcept)|(?:atomic_commit)|(?:__has_include)|(?:atomic_cancel)|(?:synchronized)|(?:thread_local)|(?:dynamic_cast)|(?:static_cast)|(?:const_cast)|(?:constexpr)|(?:co_return)|(?:constinit)|(?:namespace)|(?:protected)|(?:consteval)|(?:constexpr)|(?:constexpr)|(?:co_return)|(?:consteval)|(?:co_await)|(?:continue)|(?:template)|(?:reflexpr)|(?:volatile)|(?:register)|(?:co_await)|(?:co_yield)|(?:restrict)|(?:noexcept)|(?:volatile)|(?:override)|(?:explicit)|(?:decltype)|(?:operator)|(?:noexcept)|(?:noexcept)|(?:typename)|(?:requires)|(?:co_yield)|(?:nullptr)|(?:alignof)|(?:alignas)|(?:default)|(?:mutable)|(?:virtual)|(?:mutable)|(?:private)|(?:include)|(?:warning)|(?:_Pragma)|(?:defined)|(?:typedef)|(?:__asm__)|(?:concept)|(?:define)|(?:module)|(?:sizeof)|(?:switch)|(?:delete)|(?:pragma)|(?:and_eq)|(?:inline)|(?:xor_eq)|(?:typeid)|(?:import)|(?:extern)|(?:public)|(?:bitand)|(?:static)|(?:export)|(?:return)|(?:friend)|(?:ifndef)|(?:not_eq)|(?:false)|(?:final)|(?:break)|(?:const)|(?:catch)|(?:endif)|(?:ifdef)|(?:undef)|(?:error)|(?:audit)|(?:while)|(?:using)|(?:axiom)|(?:or_eq)|(?:compl)|(?:throw)|(?:bitor)|(?:const)|(?:line)|(?:case)|(?:else)|(?:this)|(?:true)|(?:goto)|(?:else)|(?:NULL)|(?:elif)|(?:new)|(?:asm)|(?:xor)|(?:and)|(?:try)|(?:not)|(?:for)|(?:do)|(?:if)|(?:or)|(?:if))\\b)(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\b((?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<56>?)+>)?(?![\\w<:.]))(((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))?(?:(?:&|(?:\\*))((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z))))*(?:&|(?:\\*)))?((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))((?:__cdecl|__clrcall|__stdcall|__fastcall|__thiscall|__vectorcall)?)((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))((::)?(?:(?!\\b(?:__has_cpp_attribute|reinterpret_cast|atomic_noexcept|atomic_commit|atomic_cancel|__has_include|thread_local|dynamic_cast|synchronized|static_cast|const_cast|consteval|co_return|protected|constinit|constexpr|co_return|consteval|namespace|constexpr|constexpr|co_await|explicit|volatile|noexcept|co_yield|noexcept|noexcept|requires|typename|decltype|operator|template|continue|co_await|co_yield|volatile|register|restrict|reflexpr|mutable|alignof|include|private|defined|typedef|_Pragma|__asm__|concept|mutable|warning|default|virtual|alignas|public|sizeof|delete|not_eq|bitand|and_eq|xor_eq|typeid|switch|return|struct|static|extern|inline|friend|ifndef|define|pragma|export|import|module|catch|throw|const|or_eq|compl|while|ifdef|const|bitor|union|class|undef|error|break|using|endif|goto|line|enum|this|case|else|elif|else|not|try|for|asm|and|xor|new|do|if|or|if)\\b)(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<56>?)+>)(?:\\s)*+)?::)*\\s*+)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?|\\?\\?>)|(?=[;>\\[\\]=]))|(?=(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))", + "match": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))){2,}\\&", + "match": "(?:\\&((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))){2,}\\&", "captures": { "1": { "patterns": [ @@ -3750,16 +3240,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } }, "name": "invalid.illegal.reference-type.cpp" @@ -3770,6 +3251,22 @@ } ] }, + "32": { + "patterns": [ + { + "include": "source.cpp#inline_comment" + } + ] + }, + "33": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "34": { + "name": "comment.block.cpp" + }, + "35": { + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, "36": { "patterns": [ { @@ -3784,16 +3281,7 @@ "name": "comment.block.cpp" }, "39": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "40": { "patterns": [ @@ -3809,16 +3297,7 @@ "name": "comment.block.cpp" }, "43": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "44": { "patterns": [ @@ -3834,115 +3313,63 @@ "name": "comment.block.cpp" }, "47": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "48": { - "patterns": [ - { - "include": "source.cpp#inline_comment" - } - ] - }, - "49": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "50": { - "name": "comment.block.cpp" - }, - "51": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] - }, - "52": { "name": "storage.type.modifier.calling-convention.cpp" }, - "53": { + "49": { "patterns": [ { "include": "source.cpp#inline_comment" } ] }, - "54": { + "50": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, - "55": { + "51": { "name": "comment.block.cpp" }, - "56": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "52": { + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, - "57": { + "53": { "patterns": [ { "include": "source.cpp#scope_resolution_function_definition_inner_generated" } ] }, - "58": { + "54": { "name": "punctuation.separator.namespace.access.cpp punctuation.separator.scope-resolution.function.definition.cpp" }, - "59": { + "55": { "patterns": [ { "include": "#template_call_range" } ] }, - "60": {}, - "61": { + "56": {}, + "57": { "name": "entity.name.function.definition.cpp" }, - "62": { + "58": { "patterns": [ { "include": "source.cpp#inline_comment" } ] }, - "63": { + "59": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, - "64": { + "60": { "name": "comment.block.cpp" }, - "65": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "61": { + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } }, "endCaptures": {}, @@ -3992,7 +3419,7 @@ ] }, { - "match": "(?<=^|\\))(?:(?:\\s)+)?(->)((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(\\s*+((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\s*\\(\\s*\\(.*?\\)\\s*\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(?:(?:(?:unsigned)|(?:signed)|(?:short)|(?:long))|(?:(?:struct)|(?:class)|(?:union)|(?:enum)))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*((?:::)?(?:(?!\\b(?:__has_cpp_attribute|reinterpret_cast|atomic_noexcept|atomic_commit|atomic_cancel|__has_include|thread_local|dynamic_cast|synchronized|static_cast|const_cast|consteval|co_return|protected|constinit|constexpr|co_return|consteval|namespace|constexpr|constexpr|co_await|explicit|volatile|noexcept|co_yield|noexcept|noexcept|requires|typename|decltype|operator|template|continue|co_await|co_yield|volatile|register|restrict|reflexpr|mutable|alignof|include|private|defined|typedef|_Pragma|__asm__|concept|mutable|warning|default|virtual|alignas|public|sizeof|delete|not_eq|bitand|and_eq|xor_eq|typeid|switch|return|struct|static|extern|inline|friend|ifndef|define|pragma|export|import|module|catch|throw|const|or_eq|compl|while|ifdef|const|bitor|union|class|undef|error|break|using|endif|goto|line|enum|this|case|else|elif|else|not|try|for|asm|and|xor|new|do|if|or|if)\\b)(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<23>?)+>)(?:\\s)*+)?::)*+)?((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?!(?:(?:transaction_safe_dynamic)|(?:__has_cpp_attribute)|(?:reinterpret_cast)|(?:transaction_safe)|(?:atomic_noexcept)|(?:atomic_commit)|(?:__has_include)|(?:atomic_cancel)|(?:synchronized)|(?:thread_local)|(?:dynamic_cast)|(?:static_cast)|(?:const_cast)|(?:constexpr)|(?:co_return)|(?:constinit)|(?:namespace)|(?:protected)|(?:consteval)|(?:constexpr)|(?:constexpr)|(?:co_return)|(?:consteval)|(?:co_await)|(?:continue)|(?:template)|(?:reflexpr)|(?:volatile)|(?:register)|(?:co_await)|(?:co_yield)|(?:restrict)|(?:noexcept)|(?:volatile)|(?:override)|(?:explicit)|(?:decltype)|(?:operator)|(?:noexcept)|(?:noexcept)|(?:typename)|(?:requires)|(?:co_yield)|(?:nullptr)|(?:alignof)|(?:alignas)|(?:default)|(?:mutable)|(?:virtual)|(?:mutable)|(?:private)|(?:include)|(?:warning)|(?:_Pragma)|(?:defined)|(?:typedef)|(?:__asm__)|(?:concept)|(?:define)|(?:module)|(?:sizeof)|(?:switch)|(?:delete)|(?:pragma)|(?:and_eq)|(?:inline)|(?:xor_eq)|(?:typeid)|(?:import)|(?:extern)|(?:public)|(?:bitand)|(?:static)|(?:export)|(?:return)|(?:friend)|(?:ifndef)|(?:not_eq)|(?:false)|(?:final)|(?:break)|(?:const)|(?:catch)|(?:endif)|(?:ifdef)|(?:undef)|(?:error)|(?:audit)|(?:while)|(?:using)|(?:axiom)|(?:or_eq)|(?:compl)|(?:throw)|(?:bitor)|(?:const)|(?:line)|(?:case)|(?:else)|(?:this)|(?:true)|(?:goto)|(?:else)|(?:NULL)|(?:elif)|(?:new)|(?:asm)|(?:xor)|(?:and)|(?:try)|(?:not)|(?:for)|(?:do)|(?:if)|(?:or)|(?:if))\\b)(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\b((?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<23>?)+>)?(?![\\w<:.]))", + "match": "(?<=^|\\))(?:(?:\\s)+)?(->)((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(\\s*+((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\s*\\(\\s*\\(.*?\\)\\s*\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(?:(?:(?:(?:unsigned)|(?:signed)|(?:short)|(?:long))|(?:(?:struct)|(?:class)|(?:union)|(?:enum)))((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z))))*(?:((?:::)?(?:(?!\\b(?:__has_cpp_attribute|reinterpret_cast|atomic_noexcept|atomic_commit|atomic_cancel|__has_include|thread_local|dynamic_cast|synchronized|static_cast|const_cast|consteval|co_return|protected|constinit|constexpr|co_return|consteval|namespace|constexpr|constexpr|co_await|explicit|volatile|noexcept|co_yield|noexcept|noexcept|requires|typename|decltype|operator|template|continue|co_await|co_yield|volatile|register|restrict|reflexpr|mutable|alignof|include|private|defined|typedef|_Pragma|__asm__|concept|mutable|warning|default|virtual|alignas|public|sizeof|delete|not_eq|bitand|and_eq|xor_eq|typeid|switch|return|struct|static|extern|inline|friend|ifndef|define|pragma|export|import|module|catch|throw|const|or_eq|compl|while|ifdef|const|bitor|union|class|undef|error|break|using|endif|goto|line|enum|this|case|else|elif|else|not|try|for|asm|and|xor|new|do|if|or|if)\\b)(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<23>?)+>)(?:\\s)*+)?::)*+)((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z))))?(?!(?:(?:transaction_safe_dynamic)|(?:__has_cpp_attribute)|(?:reinterpret_cast)|(?:transaction_safe)|(?:atomic_noexcept)|(?:atomic_commit)|(?:__has_include)|(?:atomic_cancel)|(?:synchronized)|(?:thread_local)|(?:dynamic_cast)|(?:static_cast)|(?:const_cast)|(?:constexpr)|(?:co_return)|(?:constinit)|(?:namespace)|(?:protected)|(?:consteval)|(?:constexpr)|(?:constexpr)|(?:co_return)|(?:consteval)|(?:co_await)|(?:continue)|(?:template)|(?:reflexpr)|(?:volatile)|(?:register)|(?:co_await)|(?:co_yield)|(?:restrict)|(?:noexcept)|(?:volatile)|(?:override)|(?:explicit)|(?:decltype)|(?:operator)|(?:noexcept)|(?:noexcept)|(?:typename)|(?:requires)|(?:co_yield)|(?:nullptr)|(?:alignof)|(?:alignas)|(?:default)|(?:mutable)|(?:virtual)|(?:mutable)|(?:private)|(?:include)|(?:warning)|(?:_Pragma)|(?:defined)|(?:typedef)|(?:__asm__)|(?:concept)|(?:define)|(?:module)|(?:sizeof)|(?:switch)|(?:delete)|(?:pragma)|(?:and_eq)|(?:inline)|(?:xor_eq)|(?:typeid)|(?:import)|(?:extern)|(?:public)|(?:bitand)|(?:static)|(?:export)|(?:return)|(?:friend)|(?:ifndef)|(?:not_eq)|(?:false)|(?:final)|(?:break)|(?:const)|(?:catch)|(?:endif)|(?:ifdef)|(?:undef)|(?:error)|(?:audit)|(?:while)|(?:using)|(?:axiom)|(?:or_eq)|(?:compl)|(?:throw)|(?:bitor)|(?:const)|(?:line)|(?:case)|(?:else)|(?:this)|(?:true)|(?:goto)|(?:else)|(?:NULL)|(?:elif)|(?:new)|(?:asm)|(?:xor)|(?:and)|(?:try)|(?:not)|(?:for)|(?:do)|(?:if)|(?:or)|(?:if))\\b)(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\b((?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<23>?)+>)?(?![\\w<:.]))", "captures": { "1": { "name": "punctuation.definition.function.return-type.cpp" @@ -4011,16 +3438,7 @@ "name": "comment.block.cpp" }, "5": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "6": { "name": "meta.qualified_type.cpp", @@ -4101,16 +3519,7 @@ "name": "comment.block.cpp" }, "11": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "12": { "patterns": [ @@ -4126,16 +3535,7 @@ "name": "comment.block.cpp" }, "15": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "16": { "patterns": [ @@ -4174,16 +3574,7 @@ "name": "comment.block.cpp" }, "22": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "23": {} } @@ -4228,9 +3619,6 @@ { "include": "#ever_present_context" }, - { - "include": "#string_context" - }, { "include": "#parameter" }, @@ -4240,8 +3628,8 @@ ] }, "function_pointer": { - "begin": "(\\s*+((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\s*\\(\\s*\\(.*?\\)\\s*\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(?:(?:(?:unsigned)|(?:signed)|(?:short)|(?:long))|(?:(?:struct)|(?:class)|(?:union)|(?:enum)))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*((?:::)?(?:(?!\\b(?:__has_cpp_attribute|reinterpret_cast|atomic_noexcept|atomic_commit|atomic_cancel|__has_include|thread_local|dynamic_cast|synchronized|static_cast|const_cast|consteval|co_return|protected|constinit|constexpr|co_return|consteval|namespace|constexpr|constexpr|co_await|explicit|volatile|noexcept|co_yield|noexcept|noexcept|requires|typename|decltype|operator|template|continue|co_await|co_yield|volatile|register|restrict|reflexpr|mutable|alignof|include|private|defined|typedef|_Pragma|__asm__|concept|mutable|warning|default|virtual|alignas|public|sizeof|delete|not_eq|bitand|and_eq|xor_eq|typeid|switch|return|struct|static|extern|inline|friend|ifndef|define|pragma|export|import|module|catch|throw|const|or_eq|compl|while|ifdef|const|bitor|union|class|undef|error|break|using|endif|goto|line|enum|this|case|else|elif|else|not|try|for|asm|and|xor|new|do|if|or|if)\\b)(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<18>?)+>)(?:\\s)*+)?::)*+)?((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?!(?:(?:transaction_safe_dynamic)|(?:__has_cpp_attribute)|(?:reinterpret_cast)|(?:transaction_safe)|(?:atomic_noexcept)|(?:atomic_commit)|(?:__has_include)|(?:atomic_cancel)|(?:synchronized)|(?:thread_local)|(?:dynamic_cast)|(?:static_cast)|(?:const_cast)|(?:constexpr)|(?:co_return)|(?:constinit)|(?:namespace)|(?:protected)|(?:consteval)|(?:constexpr)|(?:constexpr)|(?:co_return)|(?:consteval)|(?:co_await)|(?:continue)|(?:template)|(?:reflexpr)|(?:volatile)|(?:register)|(?:co_await)|(?:co_yield)|(?:restrict)|(?:noexcept)|(?:volatile)|(?:override)|(?:explicit)|(?:decltype)|(?:operator)|(?:noexcept)|(?:noexcept)|(?:typename)|(?:requires)|(?:co_yield)|(?:nullptr)|(?:alignof)|(?:alignas)|(?:default)|(?:mutable)|(?:virtual)|(?:mutable)|(?:private)|(?:include)|(?:warning)|(?:_Pragma)|(?:defined)|(?:typedef)|(?:__asm__)|(?:concept)|(?:define)|(?:module)|(?:sizeof)|(?:switch)|(?:delete)|(?:pragma)|(?:and_eq)|(?:inline)|(?:xor_eq)|(?:typeid)|(?:import)|(?:extern)|(?:public)|(?:bitand)|(?:static)|(?:export)|(?:return)|(?:friend)|(?:ifndef)|(?:not_eq)|(?:false)|(?:final)|(?:break)|(?:const)|(?:catch)|(?:endif)|(?:ifdef)|(?:undef)|(?:error)|(?:audit)|(?:while)|(?:using)|(?:axiom)|(?:or_eq)|(?:compl)|(?:throw)|(?:bitor)|(?:const)|(?:line)|(?:case)|(?:else)|(?:this)|(?:true)|(?:goto)|(?:else)|(?:NULL)|(?:elif)|(?:new)|(?:asm)|(?:xor)|(?:and)|(?:try)|(?:not)|(?:for)|(?:do)|(?:if)|(?:or)|(?:if))\\b)(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\b((?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<18>?)+>)?(?![\\w<:.]))(((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))?(?:(?:&|(?:\\*))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*(?:&|(?:\\*)))?((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(\\()(\\*)(?:(?:\\s)+)?((?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)?)(?:(?:\\s)+)?(?:(\\[)(\\w*)(\\])(?:(?:\\s)+)?)*(\\))(?:(?:\\s)+)?(\\()", - "end": "(\\))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?=[{=,);>]|\\n)(?!\\()|(?=(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<18>?)+>)(?:\\s)*+)?::)*+)((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z))))?(?!(?:(?:transaction_safe_dynamic)|(?:__has_cpp_attribute)|(?:reinterpret_cast)|(?:transaction_safe)|(?:atomic_noexcept)|(?:atomic_commit)|(?:__has_include)|(?:atomic_cancel)|(?:synchronized)|(?:thread_local)|(?:dynamic_cast)|(?:static_cast)|(?:const_cast)|(?:constexpr)|(?:co_return)|(?:constinit)|(?:namespace)|(?:protected)|(?:consteval)|(?:constexpr)|(?:constexpr)|(?:co_return)|(?:consteval)|(?:co_await)|(?:continue)|(?:template)|(?:reflexpr)|(?:volatile)|(?:register)|(?:co_await)|(?:co_yield)|(?:restrict)|(?:noexcept)|(?:volatile)|(?:override)|(?:explicit)|(?:decltype)|(?:operator)|(?:noexcept)|(?:noexcept)|(?:typename)|(?:requires)|(?:co_yield)|(?:nullptr)|(?:alignof)|(?:alignas)|(?:default)|(?:mutable)|(?:virtual)|(?:mutable)|(?:private)|(?:include)|(?:warning)|(?:_Pragma)|(?:defined)|(?:typedef)|(?:__asm__)|(?:concept)|(?:define)|(?:module)|(?:sizeof)|(?:switch)|(?:delete)|(?:pragma)|(?:and_eq)|(?:inline)|(?:xor_eq)|(?:typeid)|(?:import)|(?:extern)|(?:public)|(?:bitand)|(?:static)|(?:export)|(?:return)|(?:friend)|(?:ifndef)|(?:not_eq)|(?:false)|(?:final)|(?:break)|(?:const)|(?:catch)|(?:endif)|(?:ifdef)|(?:undef)|(?:error)|(?:audit)|(?:while)|(?:using)|(?:axiom)|(?:or_eq)|(?:compl)|(?:throw)|(?:bitor)|(?:const)|(?:line)|(?:case)|(?:else)|(?:this)|(?:true)|(?:goto)|(?:else)|(?:NULL)|(?:elif)|(?:new)|(?:asm)|(?:xor)|(?:and)|(?:try)|(?:not)|(?:for)|(?:do)|(?:if)|(?:or)|(?:if))\\b)(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\b((?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<18>?)+>)?(?![\\w<:.]))(((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))?(?:(?:&|(?:\\*))((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z))))*(?:&|(?:\\*)))?((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(\\()(\\*)(?:(?:\\s)+)?((?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)?)(?:(?:\\s)+)?(?:(\\[)(\\w*)(\\])(?:(?:\\s)+)?)*(\\))(?:(?:\\s)+)?(\\()", + "end": "(\\))((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(?=[{=,);>]|\\n)(?!\\()|(?=(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))){2,}\\&", + "match": "(?:\\&((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))){2,}\\&", "captures": { "1": { "patterns": [ @@ -4430,16 +3791,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } }, "name": "invalid.illegal.reference-type.cpp" @@ -4464,16 +3816,7 @@ "name": "comment.block.cpp" }, "23": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "24": { "patterns": [ @@ -4489,16 +3832,7 @@ "name": "comment.block.cpp" }, "27": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "28": { "patterns": [ @@ -4514,16 +3848,7 @@ "name": "comment.block.cpp" }, "31": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "32": { "name": "punctuation.section.parens.begin.bracket.round.function.pointer.cpp" @@ -4572,16 +3897,7 @@ "name": "comment.block.cpp" }, "5": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } }, "patterns": [ @@ -4591,8 +3907,8 @@ ] }, "function_pointer_parameter": { - "begin": "(\\s*+((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\s*\\(\\s*\\(.*?\\)\\s*\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(?:(?:(?:unsigned)|(?:signed)|(?:short)|(?:long))|(?:(?:struct)|(?:class)|(?:union)|(?:enum)))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*((?:::)?(?:(?!\\b(?:__has_cpp_attribute|reinterpret_cast|atomic_noexcept|atomic_commit|atomic_cancel|__has_include|thread_local|dynamic_cast|synchronized|static_cast|const_cast|consteval|co_return|protected|constinit|constexpr|co_return|consteval|namespace|constexpr|constexpr|co_await|explicit|volatile|noexcept|co_yield|noexcept|noexcept|requires|typename|decltype|operator|template|continue|co_await|co_yield|volatile|register|restrict|reflexpr|mutable|alignof|include|private|defined|typedef|_Pragma|__asm__|concept|mutable|warning|default|virtual|alignas|public|sizeof|delete|not_eq|bitand|and_eq|xor_eq|typeid|switch|return|struct|static|extern|inline|friend|ifndef|define|pragma|export|import|module|catch|throw|const|or_eq|compl|while|ifdef|const|bitor|union|class|undef|error|break|using|endif|goto|line|enum|this|case|else|elif|else|not|try|for|asm|and|xor|new|do|if|or|if)\\b)(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<18>?)+>)(?:\\s)*+)?::)*+)?((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?!(?:(?:transaction_safe_dynamic)|(?:__has_cpp_attribute)|(?:reinterpret_cast)|(?:transaction_safe)|(?:atomic_noexcept)|(?:atomic_commit)|(?:__has_include)|(?:atomic_cancel)|(?:synchronized)|(?:thread_local)|(?:dynamic_cast)|(?:static_cast)|(?:const_cast)|(?:constexpr)|(?:co_return)|(?:constinit)|(?:namespace)|(?:protected)|(?:consteval)|(?:constexpr)|(?:constexpr)|(?:co_return)|(?:consteval)|(?:co_await)|(?:continue)|(?:template)|(?:reflexpr)|(?:volatile)|(?:register)|(?:co_await)|(?:co_yield)|(?:restrict)|(?:noexcept)|(?:volatile)|(?:override)|(?:explicit)|(?:decltype)|(?:operator)|(?:noexcept)|(?:noexcept)|(?:typename)|(?:requires)|(?:co_yield)|(?:nullptr)|(?:alignof)|(?:alignas)|(?:default)|(?:mutable)|(?:virtual)|(?:mutable)|(?:private)|(?:include)|(?:warning)|(?:_Pragma)|(?:defined)|(?:typedef)|(?:__asm__)|(?:concept)|(?:define)|(?:module)|(?:sizeof)|(?:switch)|(?:delete)|(?:pragma)|(?:and_eq)|(?:inline)|(?:xor_eq)|(?:typeid)|(?:import)|(?:extern)|(?:public)|(?:bitand)|(?:static)|(?:export)|(?:return)|(?:friend)|(?:ifndef)|(?:not_eq)|(?:false)|(?:final)|(?:break)|(?:const)|(?:catch)|(?:endif)|(?:ifdef)|(?:undef)|(?:error)|(?:audit)|(?:while)|(?:using)|(?:axiom)|(?:or_eq)|(?:compl)|(?:throw)|(?:bitor)|(?:const)|(?:line)|(?:case)|(?:else)|(?:this)|(?:true)|(?:goto)|(?:else)|(?:NULL)|(?:elif)|(?:new)|(?:asm)|(?:xor)|(?:and)|(?:try)|(?:not)|(?:for)|(?:do)|(?:if)|(?:or)|(?:if))\\b)(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\b((?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<18>?)+>)?(?![\\w<:.]))(((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))?(?:(?:&|(?:\\*))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*(?:&|(?:\\*)))?((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(\\()(\\*)(?:(?:\\s)+)?((?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)?)(?:(?:\\s)+)?(?:(\\[)(\\w*)(\\])(?:(?:\\s)+)?)*(\\))(?:(?:\\s)+)?(\\()", - "end": "(\\))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?=[{=,);>]|\\n)(?!\\()|(?=(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<18>?)+>)(?:\\s)*+)?::)*+)((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z))))?(?!(?:(?:transaction_safe_dynamic)|(?:__has_cpp_attribute)|(?:reinterpret_cast)|(?:transaction_safe)|(?:atomic_noexcept)|(?:atomic_commit)|(?:__has_include)|(?:atomic_cancel)|(?:synchronized)|(?:thread_local)|(?:dynamic_cast)|(?:static_cast)|(?:const_cast)|(?:constexpr)|(?:co_return)|(?:constinit)|(?:namespace)|(?:protected)|(?:consteval)|(?:constexpr)|(?:constexpr)|(?:co_return)|(?:consteval)|(?:co_await)|(?:continue)|(?:template)|(?:reflexpr)|(?:volatile)|(?:register)|(?:co_await)|(?:co_yield)|(?:restrict)|(?:noexcept)|(?:volatile)|(?:override)|(?:explicit)|(?:decltype)|(?:operator)|(?:noexcept)|(?:noexcept)|(?:typename)|(?:requires)|(?:co_yield)|(?:nullptr)|(?:alignof)|(?:alignas)|(?:default)|(?:mutable)|(?:virtual)|(?:mutable)|(?:private)|(?:include)|(?:warning)|(?:_Pragma)|(?:defined)|(?:typedef)|(?:__asm__)|(?:concept)|(?:define)|(?:module)|(?:sizeof)|(?:switch)|(?:delete)|(?:pragma)|(?:and_eq)|(?:inline)|(?:xor_eq)|(?:typeid)|(?:import)|(?:extern)|(?:public)|(?:bitand)|(?:static)|(?:export)|(?:return)|(?:friend)|(?:ifndef)|(?:not_eq)|(?:false)|(?:final)|(?:break)|(?:const)|(?:catch)|(?:endif)|(?:ifdef)|(?:undef)|(?:error)|(?:audit)|(?:while)|(?:using)|(?:axiom)|(?:or_eq)|(?:compl)|(?:throw)|(?:bitor)|(?:const)|(?:line)|(?:case)|(?:else)|(?:this)|(?:true)|(?:goto)|(?:else)|(?:NULL)|(?:elif)|(?:new)|(?:asm)|(?:xor)|(?:and)|(?:try)|(?:not)|(?:for)|(?:do)|(?:if)|(?:or)|(?:if))\\b)(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\b((?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<18>?)+>)?(?![\\w<:.]))(((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))?(?:(?:&|(?:\\*))((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z))))*(?:&|(?:\\*)))?((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(\\()(\\*)(?:(?:\\s)+)?((?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)?)(?:(?:\\s)+)?(?:(\\[)(\\w*)(\\])(?:(?:\\s)+)?)*(\\))(?:(?:\\s)+)?(\\()", + "end": "(\\))((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(?=[{=,);>]|\\n)(?!\\()|(?=(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))){2,}\\&", + "match": "(?:\\&((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))){2,}\\&", "captures": { "1": { "patterns": [ @@ -4781,16 +4070,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } }, "name": "invalid.illegal.reference-type.cpp" @@ -4815,16 +4095,7 @@ "name": "comment.block.cpp" }, "23": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "24": { "patterns": [ @@ -4840,16 +4111,7 @@ "name": "comment.block.cpp" }, "27": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "28": { "patterns": [ @@ -4865,16 +4127,7 @@ "name": "comment.block.cpp" }, "31": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "32": { "name": "punctuation.section.parens.begin.bracket.round.function.pointer.cpp" @@ -4923,16 +4176,7 @@ "name": "comment.block.cpp" }, "5": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } }, "patterns": [ @@ -5023,7 +4267,7 @@ "name": "storage.type.modifier.virtual.cpp" }, { - "match": "(?<=protected|virtual|private|public|,|:)(?:(?:\\s)+)?(?!(?:(?:(?:protected)|(?:private)|(?:public))|virtual))(\\s*+((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\s*\\(\\s*\\(.*?\\)\\s*\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(?:(?:(?:unsigned)|(?:signed)|(?:short)|(?:long))|(?:(?:struct)|(?:class)|(?:union)|(?:enum)))((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*((?:::)?(?:(?!\\b(?:__has_cpp_attribute|reinterpret_cast|atomic_noexcept|atomic_commit|atomic_cancel|__has_include|thread_local|dynamic_cast|synchronized|static_cast|const_cast|consteval|co_return|protected|constinit|constexpr|co_return|consteval|namespace|constexpr|constexpr|co_await|explicit|volatile|noexcept|co_yield|noexcept|noexcept|requires|typename|decltype|operator|template|continue|co_await|co_yield|volatile|register|restrict|reflexpr|mutable|alignof|include|private|defined|typedef|_Pragma|__asm__|concept|mutable|warning|default|virtual|alignas|public|sizeof|delete|not_eq|bitand|and_eq|xor_eq|typeid|switch|return|struct|static|extern|inline|friend|ifndef|define|pragma|export|import|module|catch|throw|const|or_eq|compl|while|ifdef|const|bitor|union|class|undef|error|break|using|endif|goto|line|enum|this|case|else|elif|else|not|try|for|asm|and|xor|new|do|if|or|if)\\b)(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<12>?)+>)(?:\\s)*+)?::)*+)?((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?!(?:(?:transaction_safe_dynamic)|(?:__has_cpp_attribute)|(?:reinterpret_cast)|(?:transaction_safe)|(?:atomic_noexcept)|(?:atomic_commit)|(?:__has_include)|(?:atomic_cancel)|(?:synchronized)|(?:thread_local)|(?:dynamic_cast)|(?:static_cast)|(?:const_cast)|(?:constexpr)|(?:co_return)|(?:constinit)|(?:namespace)|(?:protected)|(?:consteval)|(?:constexpr)|(?:constexpr)|(?:co_return)|(?:consteval)|(?:co_await)|(?:continue)|(?:template)|(?:reflexpr)|(?:volatile)|(?:register)|(?:co_await)|(?:co_yield)|(?:restrict)|(?:noexcept)|(?:volatile)|(?:override)|(?:explicit)|(?:decltype)|(?:operator)|(?:noexcept)|(?:noexcept)|(?:typename)|(?:requires)|(?:co_yield)|(?:nullptr)|(?:alignof)|(?:alignas)|(?:default)|(?:mutable)|(?:virtual)|(?:mutable)|(?:private)|(?:include)|(?:warning)|(?:_Pragma)|(?:defined)|(?:typedef)|(?:__asm__)|(?:concept)|(?:define)|(?:module)|(?:sizeof)|(?:switch)|(?:delete)|(?:pragma)|(?:and_eq)|(?:inline)|(?:xor_eq)|(?:typeid)|(?:import)|(?:extern)|(?:public)|(?:bitand)|(?:static)|(?:export)|(?:return)|(?:friend)|(?:ifndef)|(?:not_eq)|(?:false)|(?:final)|(?:break)|(?:const)|(?:catch)|(?:endif)|(?:ifdef)|(?:undef)|(?:error)|(?:audit)|(?:while)|(?:using)|(?:axiom)|(?:or_eq)|(?:compl)|(?:throw)|(?:bitor)|(?:const)|(?:line)|(?:case)|(?:else)|(?:this)|(?:true)|(?:goto)|(?:else)|(?:NULL)|(?:elif)|(?:new)|(?:asm)|(?:xor)|(?:and)|(?:try)|(?:not)|(?:for)|(?:do)|(?:if)|(?:or)|(?:if))\\b)(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\b((?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<12>?)+>)?(?![\\w<:.]))", + "match": "(?<=protected|virtual|private|public|,|:)(?:(?:\\s)+)?(?!(?:(?:(?:protected)|(?:private)|(?:public))|virtual))(\\s*+((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\s*\\(\\s*\\(.*?\\)\\s*\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?((?:((?:\\s*+\\/\\*(?:[^\\*]++|\\*+(?!\\/))*+\\*\\/\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(?:(?:(?:(?:unsigned)|(?:signed)|(?:short)|(?:long))|(?:(?:struct)|(?:class)|(?:union)|(?:enum)))((?:((?:\\s*+\\/\\*(?:[^\\*]++|\\*+(?!\\/))*+\\*\\/\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z))))*(?:((?:::)?(?:(?!\\b(?:__has_cpp_attribute|reinterpret_cast|atomic_noexcept|atomic_commit|atomic_cancel|__has_include|thread_local|dynamic_cast|synchronized|static_cast|const_cast|consteval|co_return|protected|constinit|constexpr|co_return|consteval|namespace|constexpr|constexpr|co_await|explicit|volatile|noexcept|co_yield|noexcept|noexcept|requires|typename|decltype|operator|template|continue|co_await|co_yield|volatile|register|restrict|reflexpr|mutable|alignof|include|private|defined|typedef|_Pragma|__asm__|concept|mutable|warning|default|virtual|alignas|public|sizeof|delete|not_eq|bitand|and_eq|xor_eq|typeid|switch|return|struct|static|extern|inline|friend|ifndef|define|pragma|export|import|module|catch|throw|const|or_eq|compl|while|ifdef|const|bitor|union|class|undef|error|break|using|endif|goto|line|enum|this|case|else|elif|else|not|try|for|asm|and|xor|new|do|if|or|if)\\b)(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<12>?)+>)(?:\\s)*+)?::)*+)((?:((?:\\s*+\\/\\*(?:[^\\*]++|\\*+(?!\\/))*+\\*\\/\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z))))?(?!(?:(?:transaction_safe_dynamic)|(?:__has_cpp_attribute)|(?:reinterpret_cast)|(?:transaction_safe)|(?:atomic_noexcept)|(?:atomic_commit)|(?:__has_include)|(?:atomic_cancel)|(?:synchronized)|(?:thread_local)|(?:dynamic_cast)|(?:static_cast)|(?:const_cast)|(?:constexpr)|(?:co_return)|(?:constinit)|(?:namespace)|(?:protected)|(?:consteval)|(?:constexpr)|(?:constexpr)|(?:co_return)|(?:consteval)|(?:co_await)|(?:continue)|(?:template)|(?:reflexpr)|(?:volatile)|(?:register)|(?:co_await)|(?:co_yield)|(?:restrict)|(?:noexcept)|(?:volatile)|(?:override)|(?:explicit)|(?:decltype)|(?:operator)|(?:noexcept)|(?:noexcept)|(?:typename)|(?:requires)|(?:co_yield)|(?:nullptr)|(?:alignof)|(?:alignas)|(?:default)|(?:mutable)|(?:virtual)|(?:mutable)|(?:private)|(?:include)|(?:warning)|(?:_Pragma)|(?:defined)|(?:typedef)|(?:__asm__)|(?:concept)|(?:define)|(?:module)|(?:sizeof)|(?:switch)|(?:delete)|(?:pragma)|(?:and_eq)|(?:inline)|(?:xor_eq)|(?:typeid)|(?:import)|(?:extern)|(?:public)|(?:bitand)|(?:static)|(?:export)|(?:return)|(?:friend)|(?:ifndef)|(?:not_eq)|(?:false)|(?:final)|(?:break)|(?:const)|(?:catch)|(?:endif)|(?:ifdef)|(?:undef)|(?:error)|(?:audit)|(?:while)|(?:using)|(?:axiom)|(?:or_eq)|(?:compl)|(?:throw)|(?:bitor)|(?:const)|(?:line)|(?:case)|(?:else)|(?:this)|(?:true)|(?:goto)|(?:else)|(?:NULL)|(?:elif)|(?:new)|(?:asm)|(?:xor)|(?:and)|(?:try)|(?:not)|(?:for)|(?:do)|(?:if)|(?:or)|(?:if))\\b)(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\b((?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<12>?)+>)?(?![\\w<:.]))", "captures": { "1": { "name": "meta.qualified_type.cpp", @@ -5100,7 +4344,7 @@ "4": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -5109,16 +4353,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -5134,7 +4369,7 @@ "6": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -5143,16 +4378,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -5191,7 +4417,7 @@ "11": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -5200,16 +4426,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -5221,7 +4438,7 @@ ] }, "lambdas": { - "begin": "(?:(?<=[^\\s]|^)(?])|(?<=\\Wreturn|^return))(?:(?:\\s)+)?(\\[(?!\\[| *+\"| *+\\d))((?:[^\\[\\]]|((??)++\\]))*+)(\\](?!((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))[\\[\\];]))", + "begin": "(?:(?<=[^\\s]|^)(?])|(?<=\\Wreturn|^return))(?:(?:\\s)+)?(\\[(?!\\[| *+\"| *+\\d))((?:[^\\[\\]]|((??)++\\]))*+)(\\](?!((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))[\\[\\];]))", "end": "(?<=[;}])|(?=(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(?:(?=\\]|\\z|$)|(,))|(\\=))", + "match": "((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(?:(?:(?=\\]|\\z|$)|(,))|(\\=))", "captures": { "1": { "name": "variable.parameter.capture.cpp" @@ -5253,16 +4470,7 @@ "name": "comment.block.cpp" }, "5": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "6": { "name": "punctuation.separator.delimiter.comma.cpp" @@ -5295,16 +4503,7 @@ "name": "comment.block.cpp" }, "8": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } }, "endCaptures": {}, @@ -5375,7 +4574,7 @@ ] }, "line": { - "begin": "^((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(#)(?:(?:\\s)+)?line\\b", + "begin": "^((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(#)(?:(?:\\s)+)?line\\b", "end": "(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(#)(?:(?:\\s)+)?define\\b)(?:(?:\\s)+)?((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?\\*|->)))((?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*(?:(?:\\s)+)?(?:(?:\\.\\*|\\.)|(?:->\\*|->))(?:(?:\\s)+)?)*)(?:(?:\\s)+)?(~?(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)(?:(?:\\s)+)?(\\()", + "begin": "(?:((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))((?\\*|->)))((?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*(?:(?:\\s)+)?(?:(?:\\.\\*|\\.)|(?:->\\*|->))(?:(?:\\s)+)?)*)(?:(?:\\s)+)?(~?(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)(?:(?:\\s)+)?(\\()", "end": "\\)|(?=(?|->\\*))(?:(?:\\s)+)?(?:((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?\\*|->)))", + "match": "(?<=(?:\\.\\*|\\.|->|->\\*))(?:(?:\\s)+)?(?:((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))((?\\*|->)))", "captures": { "1": { "patterns": [ @@ -5589,16 +4761,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "5": { "name": "variable.language.this.cpp" @@ -5615,7 +4778,7 @@ } }, { - "match": "(?:((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?\\*|->)))", + "match": "(?:((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))((?\\*|->)))", "captures": { "1": { "patterns": [ @@ -5631,16 +4794,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "5": { "name": "variable.language.this.cpp" @@ -5842,7 +4996,7 @@ ] }, "noexcept_operator": { - "begin": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(\\()", + "begin": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(?:(?:(?:unsigned)|(?:signed)|(?:short)|(?:long))|(?:(?:struct)|(?:class)|(?:union)|(?:enum)))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*((?:::)?(?:(?!\\b(?:__has_cpp_attribute|reinterpret_cast|atomic_noexcept|atomic_commit|atomic_cancel|__has_include|thread_local|dynamic_cast|synchronized|static_cast|const_cast|consteval|co_return|protected|constinit|constexpr|co_return|consteval|namespace|constexpr|constexpr|co_await|explicit|volatile|noexcept|co_yield|noexcept|noexcept|requires|typename|decltype|operator|template|continue|co_await|co_yield|volatile|register|restrict|reflexpr|mutable|alignof|include|private|defined|typedef|_Pragma|__asm__|concept|mutable|warning|default|virtual|alignas|public|sizeof|delete|not_eq|bitand|and_eq|xor_eq|typeid|switch|return|struct|static|extern|inline|friend|ifndef|define|pragma|export|import|module|catch|throw|const|or_eq|compl|while|ifdef|const|bitor|union|class|undef|error|break|using|endif|goto|line|enum|this|case|else|elif|else|not|try|for|asm|and|xor|new|do|if|or|if)\\b)(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<55>?)+>)(?:\\s)*+)?::)*+)?((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?!(?:(?:transaction_safe_dynamic)|(?:__has_cpp_attribute)|(?:reinterpret_cast)|(?:transaction_safe)|(?:atomic_noexcept)|(?:atomic_commit)|(?:__has_include)|(?:atomic_cancel)|(?:synchronized)|(?:thread_local)|(?:dynamic_cast)|(?:static_cast)|(?:const_cast)|(?:constexpr)|(?:co_return)|(?:constinit)|(?:namespace)|(?:protected)|(?:consteval)|(?:constexpr)|(?:constexpr)|(?:co_return)|(?:consteval)|(?:co_await)|(?:continue)|(?:template)|(?:reflexpr)|(?:volatile)|(?:register)|(?:co_await)|(?:co_yield)|(?:restrict)|(?:noexcept)|(?:volatile)|(?:override)|(?:explicit)|(?:decltype)|(?:operator)|(?:noexcept)|(?:noexcept)|(?:typename)|(?:requires)|(?:co_yield)|(?:nullptr)|(?:alignof)|(?:alignas)|(?:default)|(?:mutable)|(?:virtual)|(?:mutable)|(?:private)|(?:include)|(?:warning)|(?:_Pragma)|(?:defined)|(?:typedef)|(?:__asm__)|(?:concept)|(?:define)|(?:module)|(?:sizeof)|(?:switch)|(?:delete)|(?:pragma)|(?:and_eq)|(?:inline)|(?:xor_eq)|(?:typeid)|(?:import)|(?:extern)|(?:public)|(?:bitand)|(?:static)|(?:export)|(?:return)|(?:friend)|(?:ifndef)|(?:not_eq)|(?:false)|(?:final)|(?:break)|(?:const)|(?:catch)|(?:endif)|(?:ifdef)|(?:undef)|(?:error)|(?:audit)|(?:while)|(?:using)|(?:axiom)|(?:or_eq)|(?:compl)|(?:throw)|(?:bitor)|(?:const)|(?:line)|(?:case)|(?:else)|(?:this)|(?:true)|(?:goto)|(?:else)|(?:NULL)|(?:elif)|(?:new)|(?:asm)|(?:xor)|(?:and)|(?:try)|(?:not)|(?:for)|(?:do)|(?:if)|(?:or)|(?:if))\\b)(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\b((?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<55>?)+>)?(?![\\w<:.]))(((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))?(?:(?:&|(?:\\*))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*(?:&|(?:\\*)))?((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))?((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?:__cdecl|__clrcall|__stdcall|__fastcall|__thiscall|__vectorcall)?)((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?:::)?(?:(?!\\b(?:__has_cpp_attribute|reinterpret_cast|atomic_noexcept|atomic_commit|atomic_cancel|__has_include|thread_local|dynamic_cast|synchronized|static_cast|const_cast|consteval|co_return|protected|constinit|constexpr|co_return|consteval|namespace|constexpr|constexpr|co_await|explicit|volatile|noexcept|co_yield|noexcept|noexcept|requires|typename|decltype|operator|template|continue|co_await|co_yield|volatile|register|restrict|reflexpr|mutable|alignof|include|private|defined|typedef|_Pragma|__asm__|concept|mutable|warning|default|virtual|alignas|public|sizeof|delete|not_eq|bitand|and_eq|xor_eq|typeid|switch|return|struct|static|extern|inline|friend|ifndef|define|pragma|export|import|module|catch|throw|const|or_eq|compl|while|ifdef|const|bitor|union|class|undef|error|break|using|endif|goto|line|enum|this|case|else|elif|else|not|try|for|asm|and|xor|new|do|if|or|if)\\b)(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<55>?)+>)(?:\\s)*+)?::)*+)(operator)((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?:::)?(?:(?!\\b(?:__has_cpp_attribute|reinterpret_cast|atomic_noexcept|atomic_commit|atomic_cancel|__has_include|thread_local|dynamic_cast|synchronized|static_cast|const_cast|consteval|co_return|protected|constinit|constexpr|co_return|consteval|namespace|constexpr|constexpr|co_await|explicit|volatile|noexcept|co_yield|noexcept|noexcept|requires|typename|decltype|operator|template|continue|co_await|co_yield|volatile|register|restrict|reflexpr|mutable|alignof|include|private|defined|typedef|_Pragma|__asm__|concept|mutable|warning|default|virtual|alignas|public|sizeof|delete|not_eq|bitand|and_eq|xor_eq|typeid|switch|return|struct|static|extern|inline|friend|ifndef|define|pragma|export|import|module|catch|throw|const|or_eq|compl|while|ifdef|const|bitor|union|class|undef|error|break|using|endif|goto|line|enum|this|case|else|elif|else|not|try|for|asm|and|xor|new|do|if|or|if)\\b)(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<55>?)+>)(?:\\s)*+)?::)*+)(?:(?:((?:(?:delete\\[\\])|(?:delete)|(?:new\\[\\])|(?:<=>)|(?:<<=)|(?:new)|(?:>>=)|(?:\\->\\*)|(?:\\/=)|(?:%=)|(?:&=)|(?:>=)|(?:\\|=)|(?:\\+\\+)|(?:\\-\\-)|(?:\\(\\))|(?:\\[\\])|(?:\\->)|(?:\\+\\+)|(?:<<)|(?:>>)|(?:\\-\\-)|(?:<=)|(?:\\^=)|(?:==)|(?:!=)|(?:&&)|(?:\\|\\|)|(?:\\+=)|(?:\\-=)|(?:\\*=)|,|(?:\\+)|(?:\\-)|!|~|(?:\\*)|&|(?:\\*)|(?:\\/)|%|(?:\\+)|(?:\\-)|<|>|&|(?:\\^)|(?:\\|)|=))|((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))?(?:(?:&|(?:\\*))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*(?:&|(?:\\*)))?((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?:\\[\\])?)))|(\"\")((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?=\\<|\\()", + "begin": "(?:(\\s*+((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\s*\\(\\s*\\(.*?\\)\\s*\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(?:(?:(?:(?:unsigned)|(?:signed)|(?:short)|(?:long))|(?:(?:struct)|(?:class)|(?:union)|(?:enum)))((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z))))*(?:((?:::)?(?:(?!\\b(?:__has_cpp_attribute|reinterpret_cast|atomic_noexcept|atomic_commit|atomic_cancel|__has_include|thread_local|dynamic_cast|synchronized|static_cast|const_cast|consteval|co_return|protected|constinit|constexpr|co_return|consteval|namespace|constexpr|constexpr|co_await|explicit|volatile|noexcept|co_yield|noexcept|noexcept|requires|typename|decltype|operator|template|continue|co_await|co_yield|volatile|register|restrict|reflexpr|mutable|alignof|include|private|defined|typedef|_Pragma|__asm__|concept|mutable|warning|default|virtual|alignas|public|sizeof|delete|not_eq|bitand|and_eq|xor_eq|typeid|switch|return|struct|static|extern|inline|friend|ifndef|define|pragma|export|import|module|catch|throw|const|or_eq|compl|while|ifdef|const|bitor|union|class|undef|error|break|using|endif|goto|line|enum|this|case|else|elif|else|not|try|for|asm|and|xor|new|do|if|or|if)\\b)(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<55>?)+>)(?:\\s)*+)?::)*+)((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z))))?(?!(?:(?:transaction_safe_dynamic)|(?:__has_cpp_attribute)|(?:reinterpret_cast)|(?:transaction_safe)|(?:atomic_noexcept)|(?:atomic_commit)|(?:__has_include)|(?:atomic_cancel)|(?:synchronized)|(?:thread_local)|(?:dynamic_cast)|(?:static_cast)|(?:const_cast)|(?:constexpr)|(?:co_return)|(?:constinit)|(?:namespace)|(?:protected)|(?:consteval)|(?:constexpr)|(?:constexpr)|(?:co_return)|(?:consteval)|(?:co_await)|(?:continue)|(?:template)|(?:reflexpr)|(?:volatile)|(?:register)|(?:co_await)|(?:co_yield)|(?:restrict)|(?:noexcept)|(?:volatile)|(?:override)|(?:explicit)|(?:decltype)|(?:operator)|(?:noexcept)|(?:noexcept)|(?:typename)|(?:requires)|(?:co_yield)|(?:nullptr)|(?:alignof)|(?:alignas)|(?:default)|(?:mutable)|(?:virtual)|(?:mutable)|(?:private)|(?:include)|(?:warning)|(?:_Pragma)|(?:defined)|(?:typedef)|(?:__asm__)|(?:concept)|(?:define)|(?:module)|(?:sizeof)|(?:switch)|(?:delete)|(?:pragma)|(?:and_eq)|(?:inline)|(?:xor_eq)|(?:typeid)|(?:import)|(?:extern)|(?:public)|(?:bitand)|(?:static)|(?:export)|(?:return)|(?:friend)|(?:ifndef)|(?:not_eq)|(?:false)|(?:final)|(?:break)|(?:const)|(?:catch)|(?:endif)|(?:ifdef)|(?:undef)|(?:error)|(?:audit)|(?:while)|(?:using)|(?:axiom)|(?:or_eq)|(?:compl)|(?:throw)|(?:bitor)|(?:const)|(?:line)|(?:case)|(?:else)|(?:this)|(?:true)|(?:goto)|(?:else)|(?:NULL)|(?:elif)|(?:new)|(?:asm)|(?:xor)|(?:and)|(?:try)|(?:not)|(?:for)|(?:do)|(?:if)|(?:or)|(?:if))\\b)(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\b((?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<55>?)+>)?(?![\\w<:.]))(((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))?(?:(?:&|(?:\\*))((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z))))*(?:&|(?:\\*)))?((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z))))?((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))((?:__cdecl|__clrcall|__stdcall|__fastcall|__thiscall|__vectorcall)?)((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))((?:::)?(?:(?!\\b(?:__has_cpp_attribute|reinterpret_cast|atomic_noexcept|atomic_commit|atomic_cancel|__has_include|thread_local|dynamic_cast|synchronized|static_cast|const_cast|consteval|co_return|protected|constinit|constexpr|co_return|consteval|namespace|constexpr|constexpr|co_await|explicit|volatile|noexcept|co_yield|noexcept|noexcept|requires|typename|decltype|operator|template|continue|co_await|co_yield|volatile|register|restrict|reflexpr|mutable|alignof|include|private|defined|typedef|_Pragma|__asm__|concept|mutable|warning|default|virtual|alignas|public|sizeof|delete|not_eq|bitand|and_eq|xor_eq|typeid|switch|return|struct|static|extern|inline|friend|ifndef|define|pragma|export|import|module|catch|throw|const|or_eq|compl|while|ifdef|const|bitor|union|class|undef|error|break|using|endif|goto|line|enum|this|case|else|elif|else|not|try|for|asm|and|xor|new|do|if|or|if)\\b)(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<55>?)+>)(?:\\s)*+)?::)*+)(operator)((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))((?:::)?(?:(?!\\b(?:__has_cpp_attribute|reinterpret_cast|atomic_noexcept|atomic_commit|atomic_cancel|__has_include|thread_local|dynamic_cast|synchronized|static_cast|const_cast|consteval|co_return|protected|constinit|constexpr|co_return|consteval|namespace|constexpr|constexpr|co_await|explicit|volatile|noexcept|co_yield|noexcept|noexcept|requires|typename|decltype|operator|template|continue|co_await|co_yield|volatile|register|restrict|reflexpr|mutable|alignof|include|private|defined|typedef|_Pragma|__asm__|concept|mutable|warning|default|virtual|alignas|public|sizeof|delete|not_eq|bitand|and_eq|xor_eq|typeid|switch|return|struct|static|extern|inline|friend|ifndef|define|pragma|export|import|module|catch|throw|const|or_eq|compl|while|ifdef|const|bitor|union|class|undef|error|break|using|endif|goto|line|enum|this|case|else|elif|else|not|try|for|asm|and|xor|new|do|if|or|if)\\b)(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<55>?)+>)(?:\\s)*+)?::)*+)(?:(?:((?:(?:delete\\[\\])|(?:delete)|(?:new\\[\\])|(?:<=>)|(?:<<=)|(?:new)|(?:>>=)|(?:\\->\\*)|(?:\\/=)|(?:%=)|(?:&=)|(?:>=)|(?:\\|=)|(?:\\+\\+)|(?:\\-\\-)|(?:\\(\\))|(?:\\[\\])|(?:\\->)|(?:\\+\\+)|(?:<<)|(?:>>)|(?:\\-\\-)|(?:<=)|(?:\\^=)|(?:==)|(?:!=)|(?:&&)|(?:\\|\\|)|(?:\\+=)|(?:\\-=)|(?:\\*=)|,|(?:\\+)|(?:\\-)|!|~|(?:\\*)|&|(?:\\*)|(?:\\/)|%|(?:\\+)|(?:\\-)|<|>|&|(?:\\^)|(?:\\|)|=))|((?|\\?\\?>)|(?=[;>\\[\\]=]))|(?=(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))){2,}\\&", + "match": "(?:\\&((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))){2,}\\&", "captures": { "1": { "patterns": [ @@ -6083,16 +5201,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } }, "name": "invalid.illegal.reference-type.cpp" @@ -6117,16 +5226,7 @@ "name": "comment.block.cpp" }, "23": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "24": { "patterns": [ @@ -6142,16 +5242,7 @@ "name": "comment.block.cpp" }, "27": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "28": { "patterns": [ @@ -6167,16 +5258,7 @@ "name": "comment.block.cpp" }, "31": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "32": { "patterns": [ @@ -6192,16 +5274,7 @@ "name": "comment.block.cpp" }, "35": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "36": { "name": "storage.type.modifier.calling-convention.cpp" @@ -6220,16 +5293,7 @@ "name": "comment.block.cpp" }, "40": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "41": { "patterns": [ @@ -6245,16 +5309,7 @@ "name": "comment.block.cpp" }, "44": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "45": { "patterns": [ @@ -6296,16 +5351,7 @@ "name": "comment.block.cpp" }, "52": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "53": { "patterns": [ @@ -6343,7 +5389,7 @@ "name": "entity.name.operator.type.pointer.cpp" }, { - "match": "(?:\\&((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))){2,}\\&", + "match": "(?:\\&((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))){2,}\\&", "captures": { "1": { "patterns": [ @@ -6359,16 +5405,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } }, "name": "invalid.illegal.reference-type.cpp" @@ -6393,16 +5430,7 @@ "name": "comment.block.cpp" }, "62": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "63": { "patterns": [ @@ -6418,16 +5446,7 @@ "name": "comment.block.cpp" }, "66": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "67": { "patterns": [ @@ -6443,16 +5462,7 @@ "name": "comment.block.cpp" }, "70": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "71": { "name": "entity.name.operator.type.array.cpp" @@ -6474,16 +5484,7 @@ "name": "comment.block.cpp" }, "76": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "77": { "name": "entity.name.operator.custom-literal.cpp" @@ -6502,16 +5503,7 @@ "name": "comment.block.cpp" }, "81": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } }, "endCaptures": {}, @@ -6561,7 +5553,7 @@ "include": "source.cpp#qualifiers_and_specifiers_post_parameters" }, { - "match": "(\\=)((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(default)|(delete))", + "match": "(\\=)((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(?:(default)|(delete))", "captures": { "1": { "name": "keyword.operator.assignment.cpp" @@ -6580,16 +5572,7 @@ "name": "comment.block.cpp" }, "5": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "6": { "name": "keyword.other.default.function.cpp" @@ -6637,7 +5620,7 @@ "operators": { "patterns": [ { - "begin": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(\\()", + "begin": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(\\()", + "begin": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(\\()", + "begin": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(\\()", + "begin": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(\\()", + "begin": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(\\()", + "begin": "(\\bsizeof\\.\\.\\.)((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(\\()", "end": "\\)|(?=(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?=\\w)", + "begin": "((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(?=\\w)", "end": "(?:(?=\\))|(,))|(?=(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))+)((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(?:\\s)*+(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?=,|\\)|=)", + "match": "((?:((?:(?:thread_local)|(?:volatile)|(?:register)|(?:restrict)|(?:static)|(?:extern)|(?:const)))((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z))))+)((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(?:(?:\\s)*+(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?=\\)|,|\\[|=|\\n)", + "match": "(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))?(?:(?:&|(?:\\*))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*(?:&|(?:\\*))", + "match": "((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))?(?:(?:&|(?:\\*))((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z))))*(?:&|(?:\\*))", "captures": { "0": { "patterns": [ @@ -7249,7 +6127,7 @@ "name": "storage.modifier.pointer.cpp" }, { - "match": "(?:\\&((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))){2,}\\&", + "match": "(?:\\&((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))){2,}\\&", "captures": { "1": { "patterns": [ @@ -7265,16 +6143,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } }, "name": "invalid.illegal.reference-type.cpp" @@ -7299,16 +6168,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "5": { "patterns": [ @@ -7324,23 +6184,14 @@ "name": "comment.block.cpp" }, "8": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } ] }, "parameter_or_maybe_value": { - "begin": "((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?=\\w)", + "begin": "((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(?=\\w)", "end": "(?:(?=\\))|(,))|(?=(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))+)((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(?:\\s)*+(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?=,|\\)|=)", + "match": "((?:((?:(?:thread_local)|(?:volatile)|(?:register)|(?:restrict)|(?:static)|(?:extern)|(?:const)))((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z))))+)((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(?:(?:\\s)*+(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?=(?:\\)|,|\\[|=|\\/\\/|(?:(?:\\n)|$)))", + "match": "(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))?(?:(?:&|(?:\\*))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*(?:&|(?:\\*))", + "match": "((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))?(?:(?:&|(?:\\*))((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z))))*(?:&|(?:\\*))", "captures": { "0": { "patterns": [ @@ -7628,7 +6425,7 @@ "name": "storage.modifier.pointer.cpp" }, { - "match": "(?:\\&((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))){2,}\\&", + "match": "(?:\\&((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))){2,}\\&", "captures": { "1": { "patterns": [ @@ -7644,16 +6441,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } }, "name": "invalid.illegal.reference-type.cpp" @@ -7678,16 +6466,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "5": { "patterns": [ @@ -7703,16 +6482,7 @@ "name": "comment.block.cpp" }, "8": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } }, @@ -7749,7 +6519,7 @@ ] }, "pragma": { - "begin": "^((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(#)(?:(?:\\s)+)?pragma\\b", + "begin": "^((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(#)(?:(?:\\s)+)?pragma\\b", "end": "(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(#)(?:(?:\\s)+)?((?:(?:ifndef|ifdef)|if))", + "begin": "^((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(#)(?:(?:\\s)+)?((?:(?:ifndef|ifdef)|if))", "end": "^(?!\\s*+#\\s*(?:else|endif))|(?=(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(\\()", + "begin": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(\\()", + "begin": "(\\bsizeof\\.\\.\\.)((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(\\()", "end": "\\)|(?=(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(\\()", + "begin": "((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(?={)|(?:((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\s*\\(\\s*\\(.*?\\)\\s*\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))?((?:(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*+)?(?:((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(:(?!:)))?)", + "begin": "((?|\\?\\?>)(?:(?:\\s)+)?(;)|(;))|(?=[;>\\[\\]=]))|(?=(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))", + "match": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))?(?=:|{|$)", + "match": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(\\()", + "begin": "((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(\\()", "end": "\\)|(?=(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?|\\?\\?>)|(?=[;>\\[\\]=]))|(?=(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(?={)|(?:((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\s*\\(\\s*\\(.*?\\)\\s*\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))?((?:(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*+)?(?:((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(:(?!:)))?)", + "begin": "((?|\\?\\?>)(?:(?:\\s)+)?(;)|(;))|(?=[;>\\[\\]=]))|(?=(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))", + "match": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))?(?=:|{|$)", + "match": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))?(?:(?:&|(?:\\*))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*(?:&|(?:\\*)))?((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))){2,}\\&", + "match": "(?:\\&((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))){2,}\\&", "captures": { "1": { "patterns": [ @@ -9355,16 +7927,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } }, "name": "invalid.illegal.reference-type.cpp" @@ -9389,16 +7952,7 @@ "name": "comment.block.cpp" }, "5": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "6": { "patterns": [ @@ -9414,16 +7968,7 @@ "name": "comment.block.cpp" }, "9": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "10": { "patterns": [ @@ -9439,16 +7984,7 @@ "name": "comment.block.cpp" }, "13": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "14": { "name": "entity.name.type.alias.cpp" @@ -9475,8 +8011,8 @@ "endCaptures": {}, "patterns": [ { - "begin": "(\\s*+((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\s*\\(\\s*\\(.*?\\)\\s*\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(?:(?:(?:unsigned)|(?:signed)|(?:short)|(?:long))|(?:(?:struct)|(?:class)|(?:union)|(?:enum)))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*((?:::)?(?:(?!\\b(?:__has_cpp_attribute|reinterpret_cast|atomic_noexcept|atomic_commit|atomic_cancel|__has_include|thread_local|dynamic_cast|synchronized|static_cast|const_cast|consteval|co_return|protected|constinit|constexpr|co_return|consteval|namespace|constexpr|constexpr|co_await|explicit|volatile|noexcept|co_yield|noexcept|noexcept|requires|typename|decltype|operator|template|continue|co_await|co_yield|volatile|register|restrict|reflexpr|mutable|alignof|include|private|defined|typedef|_Pragma|__asm__|concept|mutable|warning|default|virtual|alignas|public|sizeof|delete|not_eq|bitand|and_eq|xor_eq|typeid|switch|return|struct|static|extern|inline|friend|ifndef|define|pragma|export|import|module|catch|throw|const|or_eq|compl|while|ifdef|const|bitor|union|class|undef|error|break|using|endif|goto|line|enum|this|case|else|elif|else|not|try|for|asm|and|xor|new|do|if|or|if)\\b)(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<18>?)+>)(?:\\s)*+)?::)*+)?((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?!(?:(?:transaction_safe_dynamic)|(?:__has_cpp_attribute)|(?:reinterpret_cast)|(?:transaction_safe)|(?:atomic_noexcept)|(?:atomic_commit)|(?:__has_include)|(?:atomic_cancel)|(?:synchronized)|(?:thread_local)|(?:dynamic_cast)|(?:static_cast)|(?:const_cast)|(?:constexpr)|(?:co_return)|(?:constinit)|(?:namespace)|(?:protected)|(?:consteval)|(?:constexpr)|(?:constexpr)|(?:co_return)|(?:consteval)|(?:co_await)|(?:continue)|(?:template)|(?:reflexpr)|(?:volatile)|(?:register)|(?:co_await)|(?:co_yield)|(?:restrict)|(?:noexcept)|(?:volatile)|(?:override)|(?:explicit)|(?:decltype)|(?:operator)|(?:noexcept)|(?:noexcept)|(?:typename)|(?:requires)|(?:co_yield)|(?:nullptr)|(?:alignof)|(?:alignas)|(?:default)|(?:mutable)|(?:virtual)|(?:mutable)|(?:private)|(?:include)|(?:warning)|(?:_Pragma)|(?:defined)|(?:typedef)|(?:__asm__)|(?:concept)|(?:define)|(?:module)|(?:sizeof)|(?:switch)|(?:delete)|(?:pragma)|(?:and_eq)|(?:inline)|(?:xor_eq)|(?:typeid)|(?:import)|(?:extern)|(?:public)|(?:bitand)|(?:static)|(?:export)|(?:return)|(?:friend)|(?:ifndef)|(?:not_eq)|(?:false)|(?:final)|(?:break)|(?:const)|(?:catch)|(?:endif)|(?:ifdef)|(?:undef)|(?:error)|(?:audit)|(?:while)|(?:using)|(?:axiom)|(?:or_eq)|(?:compl)|(?:throw)|(?:bitor)|(?:const)|(?:line)|(?:case)|(?:else)|(?:this)|(?:true)|(?:goto)|(?:else)|(?:NULL)|(?:elif)|(?:new)|(?:asm)|(?:xor)|(?:and)|(?:try)|(?:not)|(?:for)|(?:do)|(?:if)|(?:or)|(?:if))\\b)(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\b((?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<18>?)+>)?(?![\\w<:.]))(((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))?(?:(?:&|(?:\\*))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*(?:&|(?:\\*)))?((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(\\()(\\*)(?:(?:\\s)+)?((?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)?)(?:(?:\\s)+)?(?:(\\[)(\\w*)(\\])(?:(?:\\s)+)?)*(\\))(?:(?:\\s)+)?(\\()", - "end": "(\\))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?=[{=,);>]|\\n)(?!\\()|(?=(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<18>?)+>)(?:\\s)*+)?::)*+)((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z))))?(?!(?:(?:transaction_safe_dynamic)|(?:__has_cpp_attribute)|(?:reinterpret_cast)|(?:transaction_safe)|(?:atomic_noexcept)|(?:atomic_commit)|(?:__has_include)|(?:atomic_cancel)|(?:synchronized)|(?:thread_local)|(?:dynamic_cast)|(?:static_cast)|(?:const_cast)|(?:constexpr)|(?:co_return)|(?:constinit)|(?:namespace)|(?:protected)|(?:consteval)|(?:constexpr)|(?:constexpr)|(?:co_return)|(?:consteval)|(?:co_await)|(?:continue)|(?:template)|(?:reflexpr)|(?:volatile)|(?:register)|(?:co_await)|(?:co_yield)|(?:restrict)|(?:noexcept)|(?:volatile)|(?:override)|(?:explicit)|(?:decltype)|(?:operator)|(?:noexcept)|(?:noexcept)|(?:typename)|(?:requires)|(?:co_yield)|(?:nullptr)|(?:alignof)|(?:alignas)|(?:default)|(?:mutable)|(?:virtual)|(?:mutable)|(?:private)|(?:include)|(?:warning)|(?:_Pragma)|(?:defined)|(?:typedef)|(?:__asm__)|(?:concept)|(?:define)|(?:module)|(?:sizeof)|(?:switch)|(?:delete)|(?:pragma)|(?:and_eq)|(?:inline)|(?:xor_eq)|(?:typeid)|(?:import)|(?:extern)|(?:public)|(?:bitand)|(?:static)|(?:export)|(?:return)|(?:friend)|(?:ifndef)|(?:not_eq)|(?:false)|(?:final)|(?:break)|(?:const)|(?:catch)|(?:endif)|(?:ifdef)|(?:undef)|(?:error)|(?:audit)|(?:while)|(?:using)|(?:axiom)|(?:or_eq)|(?:compl)|(?:throw)|(?:bitor)|(?:const)|(?:line)|(?:case)|(?:else)|(?:this)|(?:true)|(?:goto)|(?:else)|(?:NULL)|(?:elif)|(?:new)|(?:asm)|(?:xor)|(?:and)|(?:try)|(?:not)|(?:for)|(?:do)|(?:if)|(?:or)|(?:if))\\b)(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\b((?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<18>?)+>)?(?![\\w<:.]))(((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))?(?:(?:&|(?:\\*))((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z))))*(?:&|(?:\\*)))?((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(\\()(\\*)(?:(?:\\s)+)?((?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)?)(?:(?:\\s)+)?(?:(\\[)(\\w*)(\\])(?:(?:\\s)+)?)*(\\))(?:(?:\\s)+)?(\\()", + "end": "(\\))((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(?=[{=,);>]|\\n)(?!\\()|(?=(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))){2,}\\&", + "match": "(?:\\&((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))){2,}\\&", "captures": { "1": { "patterns": [ @@ -9665,16 +8174,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } }, "name": "invalid.illegal.reference-type.cpp" @@ -9699,16 +8199,7 @@ "name": "comment.block.cpp" }, "23": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "24": { "patterns": [ @@ -9724,16 +8215,7 @@ "name": "comment.block.cpp" }, "27": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "28": { "patterns": [ @@ -9749,16 +8231,7 @@ "name": "comment.block.cpp" }, "31": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "32": { "name": "punctuation.section.parens.begin.bracket.round.function.pointer.cpp" @@ -9807,16 +8280,7 @@ "name": "comment.block.cpp" }, "5": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } }, "patterns": [ @@ -9838,7 +8302,7 @@ "endCaptures": {}, "patterns": [ { - "begin": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(?={)|(?:((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\s*\\(\\s*\\(.*?\\)\\s*\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))?((?:(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*+)?(?:((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(:(?!:)))?)", + "begin": "((?|\\?\\?>)(?:(?:\\s)+)?(;)|(;))|(?=[;>\\[\\]=]))|(?=(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))", + "match": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))?(?=:|{|$)", + "match": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))?(?:(?:&|(?:\\*))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*(?:&|(?:\\*)))?((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))){2,}\\&", + "match": "(?:\\&((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))){2,}\\&", "captures": { "1": { "patterns": [ @@ -10160,16 +8561,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } }, "name": "invalid.illegal.reference-type.cpp" @@ -10194,16 +8586,7 @@ "name": "comment.block.cpp" }, "5": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "6": { "patterns": [ @@ -10219,16 +8602,7 @@ "name": "comment.block.cpp" }, "9": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "10": { "patterns": [ @@ -10244,16 +8618,7 @@ "name": "comment.block.cpp" }, "13": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "14": { "name": "entity.name.type.alias.cpp" @@ -10280,7 +8645,7 @@ "endCaptures": {}, "patterns": [ { - "begin": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(?={)|(?:((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\s*\\(\\s*\\(.*?\\)\\s*\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))?((?:(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*+)?(?:((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(:(?!:)))?)", + "begin": "((?|\\?\\?>)(?:(?:\\s)+)?(;)|(;))|(?=[;>\\[\\]=]))|(?=(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))", + "match": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))?(?=:|{|$)", + "match": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))?(?:(?:&|(?:\\*))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*(?:&|(?:\\*)))?((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))){2,}\\&", + "match": "(?:\\&((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))){2,}\\&", "captures": { "1": { "patterns": [ @@ -10602,16 +8904,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } }, "name": "invalid.illegal.reference-type.cpp" @@ -10636,16 +8929,7 @@ "name": "comment.block.cpp" }, "5": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "6": { "patterns": [ @@ -10661,16 +8945,7 @@ "name": "comment.block.cpp" }, "9": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "10": { "patterns": [ @@ -10686,16 +8961,7 @@ "name": "comment.block.cpp" }, "13": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "14": { "name": "entity.name.type.alias.cpp" @@ -10712,7 +8978,7 @@ ] }, "typeid_operator": { - "begin": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(\\()", + "begin": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(?={)|(?:((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\s*\\(\\s*\\(.*?\\)\\s*\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))?((?:(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*+)?(?:((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(:(?!:)))?)", + "begin": "((?|\\?\\?>)(?:(?:\\s)+)?(;)|(;))|(?=[;>\\[\\]=]))|(?=(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))", + "match": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))?(?=:|{|$)", + "match": "((?(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(((?:(?:protected)|(?:private)|(?:public)))(?:(?:\\s)+)?(:))", + "match": "((?:((?:\\s*+\\/\\*(?:[^\\*]++|\\*+(?!\\/))*+\\*\\/\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(((?:(?:protected)|(?:private)|(?:public)))(?:(?:\\s)+)?(:))", "captures": { "1": { "patterns": [ @@ -107,7 +110,7 @@ "2": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -116,16 +119,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -205,7 +199,7 @@ ] }, "alignas_operator": { - "begin": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(\\()", + "begin": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(\\()", + "begin": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(?:\\n)|$)", + "match": "^((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(?:(?:\\n)|$)", "captures": { "1": { "patterns": [ @@ -331,16 +307,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } }, @@ -348,7 +315,7 @@ "include": "#comments" }, { - "begin": "((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))\\(", + "begin": "((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))\\(", "end": "\\)", "beginCaptures": { "0": { @@ -368,16 +335,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } }, "endCaptures": { @@ -445,7 +403,7 @@ ] }, { - "match": "\\[((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))\\]", + "match": "\\[((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))\\]", "captures": { "1": { "patterns": [ @@ -461,16 +419,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "5": { "name": "variable.other.asm.label.cpp" @@ -489,16 +438,7 @@ "name": "comment.block.cpp" }, "9": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } }, @@ -604,7 +544,7 @@ ] }, "case_statement": { - "begin": "((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(?={)|(?:((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\s*\\(\\s*\\(.*?\\)\\s*\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))?((?:(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*+)?(?:((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(:(?!:)))?)", + "begin": "((?|\\?\\?>)(?:(?:\\s)+)?(;)|(;))|(?=[;>\\[\\]=]))", "beginCaptures": { "0": { @@ -672,16 +603,7 @@ "name": "comment.block.cpp" }, "5": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "6": { "patterns": [ @@ -707,21 +629,12 @@ "name": "comment.block.cpp" }, "10": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "11": { "patterns": [ { - "match": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))", + "match": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))?(?=:|{|$)", + "match": "((?(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))?(?:(?:&|(?:\\*))((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*(?:&|(?:\\*)))?((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))\\b(?!override\\W|override\\$|final\\W|final\\$)((?(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?=\\S)(?![:{a-zA-Z])", + "match": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -977,16 +845,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -1002,7 +861,7 @@ "name": "storage.modifier.pointer.cpp" }, { - "match": "(?:\\&((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))){2,}\\&", + "match": "(?:\\&((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))){2,}\\&", "captures": { "1": { "patterns": [ @@ -1018,16 +877,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } }, "name": "invalid.illegal.reference-type.cpp" @@ -1048,7 +898,7 @@ "7": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -1057,16 +907,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -1082,7 +923,7 @@ "9": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -1091,16 +932,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -1116,7 +948,7 @@ "11": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -1125,16 +957,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -1153,7 +976,7 @@ "14": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -1162,16 +985,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -1481,7 +1295,7 @@ ] }, "constructor_inline": { - "begin": "^((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?:(?:(?:constexpr)|(?:consteval)|(?:explicit)|(?:mutable)|(?:virtual)|(?:inline)|(?:friend))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*)((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?:__cdecl|__clrcall|__stdcall|__fastcall|__thiscall|__vectorcall)?)((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?|\\?\\?>)|(?=[;>\\[\\]=]))", "beginCaptures": { "0": { @@ -1501,16 +1315,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "5": { "patterns": [ @@ -1533,16 +1338,7 @@ "name": "comment.block.cpp" }, "9": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "10": { "patterns": [ @@ -1558,16 +1354,7 @@ "name": "comment.block.cpp" }, "13": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "14": { "name": "storage.type.modifier.calling-convention.cpp" @@ -1586,16 +1373,7 @@ "name": "comment.block.cpp" }, "18": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "19": { "name": "entity.name.function.constructor.cpp entity.name.function.definition.special.constructor.cpp" @@ -1619,7 +1397,7 @@ "include": "#ever_present_context" }, { - "match": "(\\=)((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(default)|(delete))", + "match": "(\\=)((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(?:(default)|(delete))", "captures": { "1": { "name": "keyword.operator.assignment.cpp" @@ -1638,16 +1416,7 @@ "name": "comment.block.cpp" }, "5": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "6": { "name": "keyword.other.default.function.cpp keyword.other.default.constructor.cpp" @@ -1758,12 +1527,7 @@ ] }, { - "match": "((?:(?:final)|(?:override)))+", - "captures": { - "1": { - "name": "keyword.operator.$1.cpp" - } - } + "include": "#qualifiers_and_specifiers_post_parameters" }, { "include": "$self" @@ -1801,7 +1565,7 @@ ] }, "constructor_root": { - "begin": "\\s*+((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?:__cdecl|__clrcall|__stdcall|__fastcall|__thiscall|__vectorcall)?)((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?:::)?(?:(?!\\b(?:__has_cpp_attribute|reinterpret_cast|atomic_noexcept|atomic_commit|atomic_cancel|__has_include|thread_local|dynamic_cast|synchronized|static_cast|const_cast|consteval|co_return|protected|constinit|constexpr|co_return|consteval|namespace|constexpr|constexpr|co_await|explicit|volatile|noexcept|co_yield|noexcept|noexcept|requires|typename|decltype|operator|template|continue|co_await|co_yield|volatile|register|restrict|reflexpr|mutable|alignof|include|private|defined|typedef|_Pragma|__asm__|concept|mutable|warning|default|virtual|alignas|public|sizeof|delete|not_eq|bitand|and_eq|xor_eq|typeid|switch|return|struct|static|extern|inline|friend|ifndef|define|pragma|export|import|module|catch|throw|const|or_eq|compl|while|ifdef|const|bitor|union|class|undef|error|break|using|endif|goto|line|enum|this|case|else|elif|else|not|try|for|asm|and|xor|new|do|if|or|if)\\b)(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<12>?)+>)(?:\\s)*+)?::)*+)(((?>(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))::((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))\\14((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?=\\())", + "begin": "\\s*+((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))((?:__cdecl|__clrcall|__stdcall|__fastcall|__thiscall|__vectorcall)?)((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))((?:::)?(?:(?!\\b(?:__has_cpp_attribute|reinterpret_cast|atomic_noexcept|atomic_commit|atomic_cancel|__has_include|thread_local|dynamic_cast|synchronized|static_cast|const_cast|consteval|co_return|protected|constinit|constexpr|co_return|consteval|namespace|constexpr|constexpr|co_await|explicit|volatile|noexcept|co_yield|noexcept|noexcept|requires|typename|decltype|operator|template|continue|co_await|co_yield|volatile|register|restrict|reflexpr|mutable|alignof|include|private|defined|typedef|_Pragma|__asm__|concept|mutable|warning|default|virtual|alignas|public|sizeof|delete|not_eq|bitand|and_eq|xor_eq|typeid|switch|return|struct|static|extern|inline|friend|ifndef|define|pragma|export|import|module|catch|throw|const|or_eq|compl|while|ifdef|const|bitor|union|class|undef|error|break|using|endif|goto|line|enum|this|case|else|elif|else|not|try|for|asm|and|xor|new|do|if|or|if)\\b)(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<12>?)+>)(?:\\s)*+)?::)*+)(((?>(?|\\?\\?>)|(?=[;>\\[\\]=]))", "beginCaptures": { "0": { @@ -1821,16 +1585,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "5": { "name": "storage.type.modifier.calling-convention.cpp" @@ -1849,16 +1604,7 @@ "name": "comment.block.cpp" }, "9": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "10": { "patterns": [ @@ -1914,16 +1660,7 @@ "name": "comment.block.cpp" }, "18": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "19": { "patterns": [ @@ -1939,16 +1676,7 @@ "name": "comment.block.cpp" }, "22": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "23": { "patterns": [ @@ -1964,16 +1692,7 @@ "name": "comment.block.cpp" }, "26": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } }, "endCaptures": {}, @@ -1994,7 +1713,7 @@ "include": "#ever_present_context" }, { - "match": "(\\=)((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(default)|(delete))", + "match": "(\\=)((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(?:(default)|(delete))", "captures": { "1": { "name": "keyword.operator.assignment.cpp" @@ -2013,16 +1732,7 @@ "name": "comment.block.cpp" }, "5": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "6": { "name": "keyword.other.default.function.cpp keyword.other.default.constructor.cpp" @@ -2133,12 +1843,7 @@ ] }, { - "match": "((?:(?:final)|(?:override)))+", - "captures": { - "1": { - "name": "keyword.operator.$1.cpp" - } - } + "include": "#qualifiers_and_specifiers_post_parameters" }, { "include": "$self" @@ -2176,7 +1881,7 @@ ] }, "control_flow_keywords": { - "match": "((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -2197,16 +1902,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -2282,7 +1978,7 @@ ] }, "curly_initializer": { - "begin": "(\\s*+((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\s*\\(\\s*\\(.*?\\)\\s*\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(?:(?:(?:unsigned)|(?:signed)|(?:short)|(?:long))|(?:(?:struct)|(?:class)|(?:union)|(?:enum)))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*((?:::)?(?:(?!\\b(?:__has_cpp_attribute|reinterpret_cast|atomic_noexcept|atomic_commit|atomic_cancel|__has_include|thread_local|dynamic_cast|synchronized|static_cast|const_cast|consteval|co_return|protected|constinit|constexpr|co_return|consteval|namespace|constexpr|constexpr|co_await|explicit|volatile|noexcept|co_yield|noexcept|noexcept|requires|typename|decltype|operator|template|continue|co_await|co_yield|volatile|register|restrict|reflexpr|mutable|alignof|include|private|defined|typedef|_Pragma|__asm__|concept|mutable|warning|default|virtual|alignas|public|sizeof|delete|not_eq|bitand|and_eq|xor_eq|typeid|switch|return|struct|static|extern|inline|friend|ifndef|define|pragma|export|import|module|catch|throw|const|or_eq|compl|while|ifdef|const|bitor|union|class|undef|error|break|using|endif|goto|line|enum|this|case|else|elif|else|not|try|for|asm|and|xor|new|do|if|or|if)\\b)(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<18>?)+>)(?:\\s)*+)?::)*+)?((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?!(?:(?:transaction_safe_dynamic)|(?:__has_cpp_attribute)|(?:reinterpret_cast)|(?:transaction_safe)|(?:atomic_noexcept)|(?:atomic_commit)|(?:__has_include)|(?:atomic_cancel)|(?:synchronized)|(?:thread_local)|(?:dynamic_cast)|(?:static_cast)|(?:const_cast)|(?:constexpr)|(?:co_return)|(?:constinit)|(?:namespace)|(?:protected)|(?:consteval)|(?:constexpr)|(?:constexpr)|(?:co_return)|(?:consteval)|(?:co_await)|(?:continue)|(?:template)|(?:reflexpr)|(?:volatile)|(?:register)|(?:co_await)|(?:co_yield)|(?:restrict)|(?:noexcept)|(?:volatile)|(?:override)|(?:explicit)|(?:decltype)|(?:operator)|(?:noexcept)|(?:noexcept)|(?:typename)|(?:requires)|(?:co_yield)|(?:nullptr)|(?:alignof)|(?:alignas)|(?:default)|(?:mutable)|(?:virtual)|(?:mutable)|(?:private)|(?:include)|(?:warning)|(?:_Pragma)|(?:defined)|(?:typedef)|(?:__asm__)|(?:concept)|(?:define)|(?:module)|(?:sizeof)|(?:switch)|(?:delete)|(?:pragma)|(?:and_eq)|(?:inline)|(?:xor_eq)|(?:typeid)|(?:import)|(?:extern)|(?:public)|(?:bitand)|(?:static)|(?:export)|(?:return)|(?:friend)|(?:ifndef)|(?:not_eq)|(?:false)|(?:final)|(?:break)|(?:const)|(?:catch)|(?:endif)|(?:ifdef)|(?:undef)|(?:error)|(?:audit)|(?:while)|(?:using)|(?:axiom)|(?:or_eq)|(?:compl)|(?:throw)|(?:bitor)|(?:const)|(?:line)|(?:case)|(?:else)|(?:this)|(?:true)|(?:goto)|(?:else)|(?:NULL)|(?:elif)|(?:new)|(?:asm)|(?:xor)|(?:and)|(?:try)|(?:not)|(?:for)|(?:do)|(?:if)|(?:or)|(?:if))\\b)(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\b((?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<18>?)+>)?(?![\\w<:.]))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(\\{)", + "begin": "(\\s*+((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\s*\\(\\s*\\(.*?\\)\\s*\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(?:(?:(?:(?:unsigned)|(?:signed)|(?:short)|(?:long))|(?:(?:struct)|(?:class)|(?:union)|(?:enum)))((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z))))*(?:((?:::)?(?:(?!\\b(?:__has_cpp_attribute|reinterpret_cast|atomic_noexcept|atomic_commit|atomic_cancel|__has_include|thread_local|dynamic_cast|synchronized|static_cast|const_cast|consteval|co_return|protected|constinit|constexpr|co_return|consteval|namespace|constexpr|constexpr|co_await|explicit|volatile|noexcept|co_yield|noexcept|noexcept|requires|typename|decltype|operator|template|continue|co_await|co_yield|volatile|register|restrict|reflexpr|mutable|alignof|include|private|defined|typedef|_Pragma|__asm__|concept|mutable|warning|default|virtual|alignas|public|sizeof|delete|not_eq|bitand|and_eq|xor_eq|typeid|switch|return|struct|static|extern|inline|friend|ifndef|define|pragma|export|import|module|catch|throw|const|or_eq|compl|while|ifdef|const|bitor|union|class|undef|error|break|using|endif|goto|line|enum|this|case|else|elif|else|not|try|for|asm|and|xor|new|do|if|or|if)\\b)(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<18>?)+>)(?:\\s)*+)?::)*+)((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z))))?(?!(?:(?:transaction_safe_dynamic)|(?:__has_cpp_attribute)|(?:reinterpret_cast)|(?:transaction_safe)|(?:atomic_noexcept)|(?:atomic_commit)|(?:__has_include)|(?:atomic_cancel)|(?:synchronized)|(?:thread_local)|(?:dynamic_cast)|(?:static_cast)|(?:const_cast)|(?:constexpr)|(?:co_return)|(?:constinit)|(?:namespace)|(?:protected)|(?:consteval)|(?:constexpr)|(?:constexpr)|(?:co_return)|(?:consteval)|(?:co_await)|(?:continue)|(?:template)|(?:reflexpr)|(?:volatile)|(?:register)|(?:co_await)|(?:co_yield)|(?:restrict)|(?:noexcept)|(?:volatile)|(?:override)|(?:explicit)|(?:decltype)|(?:operator)|(?:noexcept)|(?:noexcept)|(?:typename)|(?:requires)|(?:co_yield)|(?:nullptr)|(?:alignof)|(?:alignas)|(?:default)|(?:mutable)|(?:virtual)|(?:mutable)|(?:private)|(?:include)|(?:warning)|(?:_Pragma)|(?:defined)|(?:typedef)|(?:__asm__)|(?:concept)|(?:define)|(?:module)|(?:sizeof)|(?:switch)|(?:delete)|(?:pragma)|(?:and_eq)|(?:inline)|(?:xor_eq)|(?:typeid)|(?:import)|(?:extern)|(?:public)|(?:bitand)|(?:static)|(?:export)|(?:return)|(?:friend)|(?:ifndef)|(?:not_eq)|(?:false)|(?:final)|(?:break)|(?:const)|(?:catch)|(?:endif)|(?:ifdef)|(?:undef)|(?:error)|(?:audit)|(?:while)|(?:using)|(?:axiom)|(?:or_eq)|(?:compl)|(?:throw)|(?:bitor)|(?:const)|(?:line)|(?:case)|(?:else)|(?:this)|(?:true)|(?:goto)|(?:else)|(?:NULL)|(?:elif)|(?:new)|(?:asm)|(?:xor)|(?:and)|(?:try)|(?:not)|(?:for)|(?:do)|(?:if)|(?:or)|(?:if))\\b)(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\b((?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<18>?)+>)?(?![\\w<:.]))((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(\\{)", "end": "\\}", "beginCaptures": { "1": { @@ -2364,16 +2060,7 @@ "name": "comment.block.cpp" }, "6": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "7": { "patterns": [ @@ -2389,16 +2076,7 @@ "name": "comment.block.cpp" }, "10": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "11": { "patterns": [ @@ -2437,16 +2115,7 @@ "name": "comment.block.cpp" }, "17": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "18": {}, "19": { @@ -2463,16 +2132,7 @@ "name": "comment.block.cpp" }, "22": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "23": { "name": "punctuation.section.arguments.begin.bracket.curly.initializer.cpp" @@ -2494,7 +2154,7 @@ ] }, "d9bc4796b0b_module_import": { - "match": "^((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((import))(?:(?:\\s)+)?(?:(?:(?:((<)[^>]*(>?)((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(?:(?:\\n)|$)|(?=\\/\\/)))|((\\\")[^\\\"]*((?:\\\")?)((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(?:(?:\\n)|$)|(?=\\/\\/))))|(((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*(?:\\.(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)*((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(?:(?:\\n)|$)|(?=(?:\\/\\/|;)))))|((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(?:(?:\\n)|$)|(?=(?:\\/\\/|;))))(?:(?:\\s)+)?(;?)", + "match": "^((?:((?:\\s*+\\/\\*(?:[^\\*]++|\\*+(?!\\/))*+\\*\\/\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))((import))(?:(?:\\s)+)?(?:(?:(?:((<)[^>]*(>?)((?:((?:\\s*+\\/\\*(?:[^\\*]++|\\*+(?!\\/))*+\\*\\/\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(?:(?:(?:\\n)|$)|(?=\\/\\/)))|((\\\")[^\\\"]*((?:\\\")?)((?:((?:\\s*+\\/\\*(?:[^\\*]++|\\*+(?!\\/))*+\\*\\/\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(?:(?:(?:\\n)|$)|(?=\\/\\/))))|(((?:((?:\\s*+\\/\\*(?:[^\\*]++|\\*+(?!\\/))*+\\*\\/\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*(?:\\.(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)*((?:((?:\\s*+\\/\\*(?:[^\\*]++|\\*+(?!\\/))*+\\*\\/\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(?:(?:(?:\\n)|$)|(?=(?:\\/\\/|;)))))|((?:((?:\\s*+\\/\\*(?:[^\\*]++|\\*+(?!\\/))*+\\*\\/\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(?:(?:(?:\\n)|$)|(?=(?:\\/\\/|;))))(?:(?:\\s)+)?(;?)", "captures": { "1": { "patterns": [ @@ -2506,7 +2166,7 @@ "2": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -2515,16 +2175,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -2552,7 +2203,7 @@ "9": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -2561,16 +2212,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -2595,7 +2237,7 @@ "14": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -2604,16 +2246,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -2632,7 +2265,7 @@ "17": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -2641,16 +2274,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -2666,7 +2290,7 @@ "19": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -2675,16 +2299,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -2700,7 +2315,7 @@ "21": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -2709,16 +2324,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -2986,7 +2592,7 @@ } }, "decltype": { - "begin": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(\\()", + "begin": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(\\()", + "begin": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?:__cdecl|__clrcall|__stdcall|__fastcall|__thiscall|__vectorcall)?)((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?:(?:(?:constexpr)|(?:consteval)|(?:explicit)|(?:mutable)|(?:virtual)|(?:inline)|(?:friend))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*)(~(?|\\?\\?>)|(?=[;>\\[\\]=]))", "beginCaptures": { "0": { @@ -3147,16 +2726,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "5": { "patterns": [ @@ -3172,16 +2742,7 @@ "name": "comment.block.cpp" }, "8": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "9": { "name": "storage.type.modifier.calling-convention.cpp" @@ -3200,16 +2761,7 @@ "name": "comment.block.cpp" }, "13": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "14": { "patterns": [ @@ -3232,16 +2784,7 @@ "name": "comment.block.cpp" }, "18": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "19": { "name": "entity.name.function.destructor.cpp entity.name.function.definition.special.member.destructor.cpp" @@ -3265,7 +2808,7 @@ "include": "#ever_present_context" }, { - "match": "(\\=)((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(default)|(delete))", + "match": "(\\=)((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(?:(default)|(delete))", "captures": { "1": { "name": "keyword.operator.assignment.cpp" @@ -3284,16 +2827,7 @@ "name": "comment.block.cpp" }, "5": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "6": { "name": "keyword.other.default.function.cpp keyword.other.default.constructor.cpp keyword.other.default.destructor.cpp" @@ -3320,12 +2854,7 @@ "patterns": [] }, { - "match": "((?:(?:final)|(?:override)))+", - "captures": { - "1": { - "name": "keyword.operator.wordlike.cpp keyword.operator.$1.cpp" - } - } + "include": "#qualifiers_and_specifiers_post_parameters" }, { "include": "$self" @@ -3363,7 +2892,7 @@ ] }, "destructor_root": { - "begin": "((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?:__cdecl|__clrcall|__stdcall|__fastcall|__thiscall|__vectorcall)?)((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?:::)?(?:(?!\\b(?:__has_cpp_attribute|reinterpret_cast|atomic_noexcept|atomic_commit|atomic_cancel|__has_include|thread_local|dynamic_cast|synchronized|static_cast|const_cast|consteval|co_return|protected|constinit|constexpr|co_return|consteval|namespace|constexpr|constexpr|co_await|explicit|volatile|noexcept|co_yield|noexcept|noexcept|requires|typename|decltype|operator|template|continue|co_await|co_yield|volatile|register|restrict|reflexpr|mutable|alignof|include|private|defined|typedef|_Pragma|__asm__|concept|mutable|warning|default|virtual|alignas|public|sizeof|delete|not_eq|bitand|and_eq|xor_eq|typeid|switch|return|struct|static|extern|inline|friend|ifndef|define|pragma|export|import|module|catch|throw|const|or_eq|compl|while|ifdef|const|bitor|union|class|undef|error|break|using|endif|goto|line|enum|this|case|else|elif|else|not|try|for|asm|and|xor|new|do|if|or|if)\\b)(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<12>?)+>)(?:\\s)*+)?::)*+)(((?>(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))::((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))~\\14((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?=\\())", + "begin": "((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))((?:__cdecl|__clrcall|__stdcall|__fastcall|__thiscall|__vectorcall)?)((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))((?:::)?(?:(?!\\b(?:__has_cpp_attribute|reinterpret_cast|atomic_noexcept|atomic_commit|atomic_cancel|__has_include|thread_local|dynamic_cast|synchronized|static_cast|const_cast|consteval|co_return|protected|constinit|constexpr|co_return|consteval|namespace|constexpr|constexpr|co_await|explicit|volatile|noexcept|co_yield|noexcept|noexcept|requires|typename|decltype|operator|template|continue|co_await|co_yield|volatile|register|restrict|reflexpr|mutable|alignof|include|private|defined|typedef|_Pragma|__asm__|concept|mutable|warning|default|virtual|alignas|public|sizeof|delete|not_eq|bitand|and_eq|xor_eq|typeid|switch|return|struct|static|extern|inline|friend|ifndef|define|pragma|export|import|module|catch|throw|const|or_eq|compl|while|ifdef|const|bitor|union|class|undef|error|break|using|endif|goto|line|enum|this|case|else|elif|else|not|try|for|asm|and|xor|new|do|if|or|if)\\b)(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<12>?)+>)(?:\\s)*+)?::)*+)(((?>(?|\\?\\?>)|(?=[;>\\[\\]=]))", "beginCaptures": { "0": { @@ -3383,16 +2912,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "5": { "name": "storage.type.modifier.calling-convention.cpp" @@ -3411,16 +2931,7 @@ "name": "comment.block.cpp" }, "9": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "10": { "patterns": [ @@ -3476,16 +2987,7 @@ "name": "comment.block.cpp" }, "18": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "19": { "patterns": [ @@ -3501,16 +3003,7 @@ "name": "comment.block.cpp" }, "22": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "23": { "patterns": [ @@ -3526,16 +3019,7 @@ "name": "comment.block.cpp" }, "26": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } }, "endCaptures": {}, @@ -3556,7 +3040,7 @@ "include": "#ever_present_context" }, { - "match": "(\\=)((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(default)|(delete))", + "match": "(\\=)((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(?:(default)|(delete))", "captures": { "1": { "name": "keyword.operator.assignment.cpp" @@ -3575,16 +3059,7 @@ "name": "comment.block.cpp" }, "5": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "6": { "name": "keyword.other.default.function.cpp keyword.other.default.constructor.cpp keyword.other.default.destructor.cpp" @@ -3611,12 +3086,7 @@ "patterns": [] }, { - "match": "((?:(?:final)|(?:override)))+", - "captures": { - "1": { - "name": "keyword.operator.wordlike.cpp keyword.operator.$1.cpp" - } - } + "include": "#qualifiers_and_specifiers_post_parameters" }, { "include": "$self" @@ -3654,7 +3124,7 @@ ] }, "diagnostic": { - "begin": "(^((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(#)(?:(?:\\s)+)?((?:error|warning)))\\b(?:(?:\\s)+)?", + "begin": "(^((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(#)(?:(?:\\s)+)?((?:error|warning)))\\b(?:(?:\\s)+)?", "end": "(?(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))?(?:(?:&|(?:\\*))((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*(?:&|(?:\\*)))?((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))\\b(?!override\\W|override\\$|final\\W|final\\$)((?(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?=\\S)(?![:{a-zA-Z])", + "match": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -3942,16 +3403,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -3967,7 +3419,7 @@ "name": "storage.modifier.pointer.cpp" }, { - "match": "(?:\\&((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))){2,}\\&", + "match": "(?:\\&((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))){2,}\\&", "captures": { "1": { "patterns": [ @@ -3983,16 +3435,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } }, "name": "invalid.illegal.reference-type.cpp" @@ -4013,7 +3456,7 @@ "7": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -4022,16 +3465,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -4047,7 +3481,7 @@ "9": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -4056,16 +3490,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -4081,7 +3506,7 @@ "11": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -4090,16 +3515,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -4118,7 +3534,7 @@ "14": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -4127,16 +3543,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -4309,7 +3716,7 @@ ] }, "exception_keywords": { - "match": "((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -4330,16 +3737,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -4351,7 +3749,7 @@ } }, "extern_block": { - "begin": "((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(extern)(?=\\s*\\\")", + "begin": "((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(extern)(?=\\s*\\\")", "end": "(?:(?:(?<=\\}|%>|\\?\\?>)(?:(?:\\s)+)?(;)|(;))|(?=[;>\\[\\]=]))", "beginCaptures": { "0": { @@ -4371,16 +3769,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "5": { "name": "storage.type.extern.cpp" @@ -4519,7 +3908,7 @@ ] }, "function_call": { - "begin": "((::)?(?:(?!\\b(?:__has_cpp_attribute|reinterpret_cast|atomic_noexcept|atomic_commit|atomic_cancel|__has_include|thread_local|dynamic_cast|synchronized|static_cast|const_cast|consteval|co_return|protected|constinit|constexpr|co_return|consteval|namespace|constexpr|constexpr|co_await|explicit|volatile|noexcept|co_yield|noexcept|noexcept|requires|typename|decltype|operator|template|continue|co_await|co_yield|volatile|register|restrict|reflexpr|mutable|alignof|include|private|defined|typedef|_Pragma|__asm__|concept|mutable|warning|default|virtual|alignas|public|sizeof|delete|not_eq|bitand|and_eq|xor_eq|typeid|switch|return|struct|static|extern|inline|friend|ifndef|define|pragma|export|import|module|catch|throw|const|or_eq|compl|while|ifdef|const|bitor|union|class|undef|error|break|using|endif|goto|line|enum|this|case|else|elif|else|not|try|for|asm|and|xor|new|do|if|or|if)\\b)(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<11>?)+>)(?:\\s)*+)?::)*\\s*+)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(((?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<11>?)+>)(?:\\s)*+)?(\\()", + "begin": "((::)?(?:(?!\\b(?:__has_cpp_attribute|reinterpret_cast|atomic_noexcept|atomic_commit|atomic_cancel|__has_include|thread_local|dynamic_cast|synchronized|static_cast|const_cast|consteval|co_return|protected|constinit|constexpr|co_return|consteval|namespace|constexpr|constexpr|co_await|explicit|volatile|noexcept|co_yield|noexcept|noexcept|requires|typename|decltype|operator|template|continue|co_await|co_yield|volatile|register|restrict|reflexpr|mutable|alignof|include|private|defined|typedef|_Pragma|__asm__|concept|mutable|warning|default|virtual|alignas|public|sizeof|delete|not_eq|bitand|and_eq|xor_eq|typeid|switch|return|struct|static|extern|inline|friend|ifndef|define|pragma|export|import|module|catch|throw|const|or_eq|compl|while|ifdef|const|bitor|union|class|undef|error|break|using|endif|goto|line|enum|this|case|else|elif|else|not|try|for|asm|and|xor|new|do|if|or|if)\\b)(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<11>?)+>)(?:\\s)*+)?::)*\\s*+)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<11>?)+>)(?:\\s)*+)?(\\()", "end": "\\)", "beginCaptures": { "1": { @@ -4557,16 +3946,7 @@ "name": "comment.block.cpp" }, "9": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "10": { "name": "meta.template.call.cpp", @@ -4593,66 +3973,32 @@ ] }, "function_definition": { - "begin": "(?:(?:^|\\G|(?<=;|\\}))|(?<=>))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))?((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\s*\\(\\s*\\(.*?\\)\\s*\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?((?:((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*)(\\s*+((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\s*\\(\\s*\\(.*?\\)\\s*\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(?:(?:(?:unsigned)|(?:signed)|(?:short)|(?:long))|(?:(?:struct)|(?:class)|(?:union)|(?:enum)))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*((?:::)?(?:(?!\\b(?:__has_cpp_attribute|reinterpret_cast|atomic_noexcept|atomic_commit|atomic_cancel|__has_include|thread_local|dynamic_cast|synchronized|static_cast|const_cast|consteval|co_return|protected|constinit|constexpr|co_return|consteval|namespace|constexpr|constexpr|co_await|explicit|volatile|noexcept|co_yield|noexcept|noexcept|requires|typename|decltype|operator|template|continue|co_await|co_yield|volatile|register|restrict|reflexpr|mutable|alignof|include|private|defined|typedef|_Pragma|__asm__|concept|mutable|warning|default|virtual|alignas|public|sizeof|delete|not_eq|bitand|and_eq|xor_eq|typeid|switch|return|struct|static|extern|inline|friend|ifndef|define|pragma|export|import|module|catch|throw|const|or_eq|compl|while|ifdef|const|bitor|union|class|undef|error|break|using|endif|goto|line|enum|this|case|else|elif|else|not|try|for|asm|and|xor|new|do|if|or|if)\\b)(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<60>?)+>)(?:\\s)*+)?::)*+)?((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?!(?:(?:transaction_safe_dynamic)|(?:__has_cpp_attribute)|(?:reinterpret_cast)|(?:transaction_safe)|(?:atomic_noexcept)|(?:atomic_commit)|(?:__has_include)|(?:atomic_cancel)|(?:synchronized)|(?:thread_local)|(?:dynamic_cast)|(?:static_cast)|(?:const_cast)|(?:constexpr)|(?:co_return)|(?:constinit)|(?:namespace)|(?:protected)|(?:consteval)|(?:constexpr)|(?:constexpr)|(?:co_return)|(?:consteval)|(?:co_await)|(?:continue)|(?:template)|(?:reflexpr)|(?:volatile)|(?:register)|(?:co_await)|(?:co_yield)|(?:restrict)|(?:noexcept)|(?:volatile)|(?:override)|(?:explicit)|(?:decltype)|(?:operator)|(?:noexcept)|(?:noexcept)|(?:typename)|(?:requires)|(?:co_yield)|(?:nullptr)|(?:alignof)|(?:alignas)|(?:default)|(?:mutable)|(?:virtual)|(?:mutable)|(?:private)|(?:include)|(?:warning)|(?:_Pragma)|(?:defined)|(?:typedef)|(?:__asm__)|(?:concept)|(?:define)|(?:module)|(?:sizeof)|(?:switch)|(?:delete)|(?:pragma)|(?:and_eq)|(?:inline)|(?:xor_eq)|(?:typeid)|(?:import)|(?:extern)|(?:public)|(?:bitand)|(?:static)|(?:export)|(?:return)|(?:friend)|(?:ifndef)|(?:not_eq)|(?:false)|(?:final)|(?:break)|(?:const)|(?:catch)|(?:endif)|(?:ifdef)|(?:undef)|(?:error)|(?:audit)|(?:while)|(?:using)|(?:axiom)|(?:or_eq)|(?:compl)|(?:throw)|(?:bitor)|(?:const)|(?:line)|(?:case)|(?:else)|(?:this)|(?:true)|(?:goto)|(?:else)|(?:NULL)|(?:elif)|(?:new)|(?:asm)|(?:xor)|(?:and)|(?:try)|(?:not)|(?:for)|(?:do)|(?:if)|(?:or)|(?:if))\\b)(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\b((?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<60>?)+>)?(?![\\w<:.]))(((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))?(?:(?:&|(?:\\*))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*(?:&|(?:\\*)))?((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?:__cdecl|__clrcall|__stdcall|__fastcall|__thiscall|__vectorcall)?)((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((::)?(?:(?!\\b(?:__has_cpp_attribute|reinterpret_cast|atomic_noexcept|atomic_commit|atomic_cancel|__has_include|thread_local|dynamic_cast|synchronized|static_cast|const_cast|consteval|co_return|protected|constinit|constexpr|co_return|consteval|namespace|constexpr|constexpr|co_await|explicit|volatile|noexcept|co_yield|noexcept|noexcept|requires|typename|decltype|operator|template|continue|co_await|co_yield|volatile|register|restrict|reflexpr|mutable|alignof|include|private|defined|typedef|_Pragma|__asm__|concept|mutable|warning|default|virtual|alignas|public|sizeof|delete|not_eq|bitand|and_eq|xor_eq|typeid|switch|return|struct|static|extern|inline|friend|ifndef|define|pragma|export|import|module|catch|throw|const|or_eq|compl|while|ifdef|const|bitor|union|class|undef|error|break|using|endif|goto|line|enum|this|case|else|elif|else|not|try|for|asm|and|xor|new|do|if|or|if)\\b)(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<60>?)+>)(?:\\s)*+)?::)*\\s*+)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?=\\()", + "begin": "(?:(?:^|\\G|(?<=;|\\}))|(?<=>|\\*\\/))\\s*+(?:((?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<56>?)+>)(?:\\s)*+)?::)*+)((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z))))?(?!(?:(?:transaction_safe_dynamic)|(?:__has_cpp_attribute)|(?:reinterpret_cast)|(?:transaction_safe)|(?:atomic_noexcept)|(?:atomic_commit)|(?:__has_include)|(?:atomic_cancel)|(?:synchronized)|(?:thread_local)|(?:dynamic_cast)|(?:static_cast)|(?:const_cast)|(?:constexpr)|(?:co_return)|(?:constinit)|(?:namespace)|(?:protected)|(?:consteval)|(?:constexpr)|(?:constexpr)|(?:co_return)|(?:consteval)|(?:co_await)|(?:continue)|(?:template)|(?:reflexpr)|(?:volatile)|(?:register)|(?:co_await)|(?:co_yield)|(?:restrict)|(?:noexcept)|(?:volatile)|(?:override)|(?:explicit)|(?:decltype)|(?:operator)|(?:noexcept)|(?:noexcept)|(?:typename)|(?:requires)|(?:co_yield)|(?:nullptr)|(?:alignof)|(?:alignas)|(?:default)|(?:mutable)|(?:virtual)|(?:mutable)|(?:private)|(?:include)|(?:warning)|(?:_Pragma)|(?:defined)|(?:typedef)|(?:__asm__)|(?:concept)|(?:define)|(?:module)|(?:sizeof)|(?:switch)|(?:delete)|(?:pragma)|(?:and_eq)|(?:inline)|(?:xor_eq)|(?:typeid)|(?:import)|(?:extern)|(?:public)|(?:bitand)|(?:static)|(?:export)|(?:return)|(?:friend)|(?:ifndef)|(?:not_eq)|(?:false)|(?:final)|(?:break)|(?:const)|(?:catch)|(?:endif)|(?:ifdef)|(?:undef)|(?:error)|(?:audit)|(?:while)|(?:using)|(?:axiom)|(?:or_eq)|(?:compl)|(?:throw)|(?:bitor)|(?:const)|(?:line)|(?:case)|(?:else)|(?:this)|(?:true)|(?:goto)|(?:else)|(?:NULL)|(?:elif)|(?:new)|(?:asm)|(?:xor)|(?:and)|(?:try)|(?:not)|(?:for)|(?:do)|(?:if)|(?:or)|(?:if))\\b)(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\b((?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<56>?)+>)?(?![\\w<:.]))(((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))?(?:(?:&|(?:\\*))((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z))))*(?:&|(?:\\*)))?((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))((?:__cdecl|__clrcall|__stdcall|__fastcall|__thiscall|__vectorcall)?)((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))((::)?(?:(?!\\b(?:__has_cpp_attribute|reinterpret_cast|atomic_noexcept|atomic_commit|atomic_cancel|__has_include|thread_local|dynamic_cast|synchronized|static_cast|const_cast|consteval|co_return|protected|constinit|constexpr|co_return|consteval|namespace|constexpr|constexpr|co_await|explicit|volatile|noexcept|co_yield|noexcept|noexcept|requires|typename|decltype|operator|template|continue|co_await|co_yield|volatile|register|restrict|reflexpr|mutable|alignof|include|private|defined|typedef|_Pragma|__asm__|concept|mutable|warning|default|virtual|alignas|public|sizeof|delete|not_eq|bitand|and_eq|xor_eq|typeid|switch|return|struct|static|extern|inline|friend|ifndef|define|pragma|export|import|module|catch|throw|const|or_eq|compl|while|ifdef|const|bitor|union|class|undef|error|break|using|endif|goto|line|enum|this|case|else|elif|else|not|try|for|asm|and|xor|new|do|if|or|if)\\b)(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<56>?)+>)(?:\\s)*+)?::)*\\s*+)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)\\b(?|\\?\\?>)|(?=[;>\\[\\]=]))", "beginCaptures": { "0": { "name": "meta.head.function.definition.cpp" }, "1": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "2": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "3": { - "name": "comment.block.cpp" - }, - "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] - }, - "5": { "name": "storage.type.template.cpp" }, - "6": { + "2": { "patterns": [ { "include": "#inline_comment" } ] }, - "7": { + "3": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, - "8": { + "4": { "name": "comment.block.cpp" }, - "9": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "5": { + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, - "10": { + "6": { "patterns": [ { "include": "#attributes_context" @@ -4662,10 +4008,10 @@ } ] }, - "11": { + "7": { "patterns": [ { - "match": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))", + "match": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))){2,}\\&", + "match": "(?:\\&((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))){2,}\\&", "captures": { "1": { "patterns": [ @@ -4914,16 +4215,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } }, "name": "invalid.illegal.reference-type.cpp" @@ -4934,6 +4226,22 @@ } ] }, + "32": { + "patterns": [ + { + "include": "#inline_comment" + } + ] + }, + "33": { + "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" + }, + "34": { + "name": "comment.block.cpp" + }, + "35": { + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" + }, "36": { "patterns": [ { @@ -4948,16 +4256,7 @@ "name": "comment.block.cpp" }, "39": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "40": { "patterns": [ @@ -4973,16 +4272,7 @@ "name": "comment.block.cpp" }, "43": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "44": { "patterns": [ @@ -4998,115 +4288,63 @@ "name": "comment.block.cpp" }, "47": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "48": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "49": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "50": { - "name": "comment.block.cpp" - }, - "51": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] - }, - "52": { "name": "storage.type.modifier.calling-convention.cpp" }, - "53": { + "49": { "patterns": [ { "include": "#inline_comment" } ] }, - "54": { + "50": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, - "55": { + "51": { "name": "comment.block.cpp" }, - "56": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "52": { + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, - "57": { + "53": { "patterns": [ { "include": "#scope_resolution_function_definition_inner_generated" } ] }, - "58": { + "54": { "name": "punctuation.separator.namespace.access.cpp punctuation.separator.scope-resolution.function.definition.cpp" }, - "59": { + "55": { "patterns": [ { "include": "#template_call_range" } ] }, - "60": {}, - "61": { + "56": {}, + "57": { "name": "entity.name.function.definition.cpp" }, - "62": { + "58": { "patterns": [ { "include": "#inline_comment" } ] }, - "63": { + "59": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" }, - "64": { + "60": { "name": "comment.block.cpp" }, - "65": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "61": { + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } }, "endCaptures": {}, @@ -5156,7 +4394,7 @@ ] }, { - "match": "(?<=^|\\))(?:(?:\\s)+)?(->)((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(\\s*+((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\s*\\(\\s*\\(.*?\\)\\s*\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(?:(?:(?:unsigned)|(?:signed)|(?:short)|(?:long))|(?:(?:struct)|(?:class)|(?:union)|(?:enum)))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*((?:::)?(?:(?!\\b(?:__has_cpp_attribute|reinterpret_cast|atomic_noexcept|atomic_commit|atomic_cancel|__has_include|thread_local|dynamic_cast|synchronized|static_cast|const_cast|consteval|co_return|protected|constinit|constexpr|co_return|consteval|namespace|constexpr|constexpr|co_await|explicit|volatile|noexcept|co_yield|noexcept|noexcept|requires|typename|decltype|operator|template|continue|co_await|co_yield|volatile|register|restrict|reflexpr|mutable|alignof|include|private|defined|typedef|_Pragma|__asm__|concept|mutable|warning|default|virtual|alignas|public|sizeof|delete|not_eq|bitand|and_eq|xor_eq|typeid|switch|return|struct|static|extern|inline|friend|ifndef|define|pragma|export|import|module|catch|throw|const|or_eq|compl|while|ifdef|const|bitor|union|class|undef|error|break|using|endif|goto|line|enum|this|case|else|elif|else|not|try|for|asm|and|xor|new|do|if|or|if)\\b)(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<23>?)+>)(?:\\s)*+)?::)*+)?((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?!(?:(?:transaction_safe_dynamic)|(?:__has_cpp_attribute)|(?:reinterpret_cast)|(?:transaction_safe)|(?:atomic_noexcept)|(?:atomic_commit)|(?:__has_include)|(?:atomic_cancel)|(?:synchronized)|(?:thread_local)|(?:dynamic_cast)|(?:static_cast)|(?:const_cast)|(?:constexpr)|(?:co_return)|(?:constinit)|(?:namespace)|(?:protected)|(?:consteval)|(?:constexpr)|(?:constexpr)|(?:co_return)|(?:consteval)|(?:co_await)|(?:continue)|(?:template)|(?:reflexpr)|(?:volatile)|(?:register)|(?:co_await)|(?:co_yield)|(?:restrict)|(?:noexcept)|(?:volatile)|(?:override)|(?:explicit)|(?:decltype)|(?:operator)|(?:noexcept)|(?:noexcept)|(?:typename)|(?:requires)|(?:co_yield)|(?:nullptr)|(?:alignof)|(?:alignas)|(?:default)|(?:mutable)|(?:virtual)|(?:mutable)|(?:private)|(?:include)|(?:warning)|(?:_Pragma)|(?:defined)|(?:typedef)|(?:__asm__)|(?:concept)|(?:define)|(?:module)|(?:sizeof)|(?:switch)|(?:delete)|(?:pragma)|(?:and_eq)|(?:inline)|(?:xor_eq)|(?:typeid)|(?:import)|(?:extern)|(?:public)|(?:bitand)|(?:static)|(?:export)|(?:return)|(?:friend)|(?:ifndef)|(?:not_eq)|(?:false)|(?:final)|(?:break)|(?:const)|(?:catch)|(?:endif)|(?:ifdef)|(?:undef)|(?:error)|(?:audit)|(?:while)|(?:using)|(?:axiom)|(?:or_eq)|(?:compl)|(?:throw)|(?:bitor)|(?:const)|(?:line)|(?:case)|(?:else)|(?:this)|(?:true)|(?:goto)|(?:else)|(?:NULL)|(?:elif)|(?:new)|(?:asm)|(?:xor)|(?:and)|(?:try)|(?:not)|(?:for)|(?:do)|(?:if)|(?:or)|(?:if))\\b)(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\b((?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<23>?)+>)?(?![\\w<:.]))", + "match": "(?<=^|\\))(?:(?:\\s)+)?(->)((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(\\s*+((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\s*\\(\\s*\\(.*?\\)\\s*\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(?:(?:(?:(?:unsigned)|(?:signed)|(?:short)|(?:long))|(?:(?:struct)|(?:class)|(?:union)|(?:enum)))((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z))))*(?:((?:::)?(?:(?!\\b(?:__has_cpp_attribute|reinterpret_cast|atomic_noexcept|atomic_commit|atomic_cancel|__has_include|thread_local|dynamic_cast|synchronized|static_cast|const_cast|consteval|co_return|protected|constinit|constexpr|co_return|consteval|namespace|constexpr|constexpr|co_await|explicit|volatile|noexcept|co_yield|noexcept|noexcept|requires|typename|decltype|operator|template|continue|co_await|co_yield|volatile|register|restrict|reflexpr|mutable|alignof|include|private|defined|typedef|_Pragma|__asm__|concept|mutable|warning|default|virtual|alignas|public|sizeof|delete|not_eq|bitand|and_eq|xor_eq|typeid|switch|return|struct|static|extern|inline|friend|ifndef|define|pragma|export|import|module|catch|throw|const|or_eq|compl|while|ifdef|const|bitor|union|class|undef|error|break|using|endif|goto|line|enum|this|case|else|elif|else|not|try|for|asm|and|xor|new|do|if|or|if)\\b)(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<23>?)+>)(?:\\s)*+)?::)*+)((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z))))?(?!(?:(?:transaction_safe_dynamic)|(?:__has_cpp_attribute)|(?:reinterpret_cast)|(?:transaction_safe)|(?:atomic_noexcept)|(?:atomic_commit)|(?:__has_include)|(?:atomic_cancel)|(?:synchronized)|(?:thread_local)|(?:dynamic_cast)|(?:static_cast)|(?:const_cast)|(?:constexpr)|(?:co_return)|(?:constinit)|(?:namespace)|(?:protected)|(?:consteval)|(?:constexpr)|(?:constexpr)|(?:co_return)|(?:consteval)|(?:co_await)|(?:continue)|(?:template)|(?:reflexpr)|(?:volatile)|(?:register)|(?:co_await)|(?:co_yield)|(?:restrict)|(?:noexcept)|(?:volatile)|(?:override)|(?:explicit)|(?:decltype)|(?:operator)|(?:noexcept)|(?:noexcept)|(?:typename)|(?:requires)|(?:co_yield)|(?:nullptr)|(?:alignof)|(?:alignas)|(?:default)|(?:mutable)|(?:virtual)|(?:mutable)|(?:private)|(?:include)|(?:warning)|(?:_Pragma)|(?:defined)|(?:typedef)|(?:__asm__)|(?:concept)|(?:define)|(?:module)|(?:sizeof)|(?:switch)|(?:delete)|(?:pragma)|(?:and_eq)|(?:inline)|(?:xor_eq)|(?:typeid)|(?:import)|(?:extern)|(?:public)|(?:bitand)|(?:static)|(?:export)|(?:return)|(?:friend)|(?:ifndef)|(?:not_eq)|(?:false)|(?:final)|(?:break)|(?:const)|(?:catch)|(?:endif)|(?:ifdef)|(?:undef)|(?:error)|(?:audit)|(?:while)|(?:using)|(?:axiom)|(?:or_eq)|(?:compl)|(?:throw)|(?:bitor)|(?:const)|(?:line)|(?:case)|(?:else)|(?:this)|(?:true)|(?:goto)|(?:else)|(?:NULL)|(?:elif)|(?:new)|(?:asm)|(?:xor)|(?:and)|(?:try)|(?:not)|(?:for)|(?:do)|(?:if)|(?:or)|(?:if))\\b)(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\b((?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<23>?)+>)?(?![\\w<:.]))", "captures": { "1": { "name": "punctuation.definition.function.return-type.cpp" @@ -5175,16 +4413,7 @@ "name": "comment.block.cpp" }, "5": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "6": { "name": "meta.qualified_type.cpp", @@ -5265,16 +4494,7 @@ "name": "comment.block.cpp" }, "11": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "12": { "patterns": [ @@ -5290,16 +4510,7 @@ "name": "comment.block.cpp" }, "15": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "16": { "patterns": [ @@ -5338,16 +4549,7 @@ "name": "comment.block.cpp" }, "22": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "23": {} } @@ -5392,9 +4594,6 @@ { "include": "#ever_present_context" }, - { - "include": "#string_context" - }, { "include": "#parameter" }, @@ -5404,8 +4603,8 @@ ] }, "function_pointer": { - "begin": "(\\s*+((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\s*\\(\\s*\\(.*?\\)\\s*\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(?:(?:(?:unsigned)|(?:signed)|(?:short)|(?:long))|(?:(?:struct)|(?:class)|(?:union)|(?:enum)))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*((?:::)?(?:(?!\\b(?:__has_cpp_attribute|reinterpret_cast|atomic_noexcept|atomic_commit|atomic_cancel|__has_include|thread_local|dynamic_cast|synchronized|static_cast|const_cast|consteval|co_return|protected|constinit|constexpr|co_return|consteval|namespace|constexpr|constexpr|co_await|explicit|volatile|noexcept|co_yield|noexcept|noexcept|requires|typename|decltype|operator|template|continue|co_await|co_yield|volatile|register|restrict|reflexpr|mutable|alignof|include|private|defined|typedef|_Pragma|__asm__|concept|mutable|warning|default|virtual|alignas|public|sizeof|delete|not_eq|bitand|and_eq|xor_eq|typeid|switch|return|struct|static|extern|inline|friend|ifndef|define|pragma|export|import|module|catch|throw|const|or_eq|compl|while|ifdef|const|bitor|union|class|undef|error|break|using|endif|goto|line|enum|this|case|else|elif|else|not|try|for|asm|and|xor|new|do|if|or|if)\\b)(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<18>?)+>)(?:\\s)*+)?::)*+)?((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?!(?:(?:transaction_safe_dynamic)|(?:__has_cpp_attribute)|(?:reinterpret_cast)|(?:transaction_safe)|(?:atomic_noexcept)|(?:atomic_commit)|(?:__has_include)|(?:atomic_cancel)|(?:synchronized)|(?:thread_local)|(?:dynamic_cast)|(?:static_cast)|(?:const_cast)|(?:constexpr)|(?:co_return)|(?:constinit)|(?:namespace)|(?:protected)|(?:consteval)|(?:constexpr)|(?:constexpr)|(?:co_return)|(?:consteval)|(?:co_await)|(?:continue)|(?:template)|(?:reflexpr)|(?:volatile)|(?:register)|(?:co_await)|(?:co_yield)|(?:restrict)|(?:noexcept)|(?:volatile)|(?:override)|(?:explicit)|(?:decltype)|(?:operator)|(?:noexcept)|(?:noexcept)|(?:typename)|(?:requires)|(?:co_yield)|(?:nullptr)|(?:alignof)|(?:alignas)|(?:default)|(?:mutable)|(?:virtual)|(?:mutable)|(?:private)|(?:include)|(?:warning)|(?:_Pragma)|(?:defined)|(?:typedef)|(?:__asm__)|(?:concept)|(?:define)|(?:module)|(?:sizeof)|(?:switch)|(?:delete)|(?:pragma)|(?:and_eq)|(?:inline)|(?:xor_eq)|(?:typeid)|(?:import)|(?:extern)|(?:public)|(?:bitand)|(?:static)|(?:export)|(?:return)|(?:friend)|(?:ifndef)|(?:not_eq)|(?:false)|(?:final)|(?:break)|(?:const)|(?:catch)|(?:endif)|(?:ifdef)|(?:undef)|(?:error)|(?:audit)|(?:while)|(?:using)|(?:axiom)|(?:or_eq)|(?:compl)|(?:throw)|(?:bitor)|(?:const)|(?:line)|(?:case)|(?:else)|(?:this)|(?:true)|(?:goto)|(?:else)|(?:NULL)|(?:elif)|(?:new)|(?:asm)|(?:xor)|(?:and)|(?:try)|(?:not)|(?:for)|(?:do)|(?:if)|(?:or)|(?:if))\\b)(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\b((?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<18>?)+>)?(?![\\w<:.]))(((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))?(?:(?:&|(?:\\*))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*(?:&|(?:\\*)))?((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(\\()(\\*)(?:(?:\\s)+)?((?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)?)(?:(?:\\s)+)?(?:(\\[)(\\w*)(\\])(?:(?:\\s)+)?)*(\\))(?:(?:\\s)+)?(\\()", - "end": "(\\))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?=[{=,);>]|\\n)(?!\\()", + "begin": "(\\s*+((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\s*\\(\\s*\\(.*?\\)\\s*\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(?:(?:(?:(?:unsigned)|(?:signed)|(?:short)|(?:long))|(?:(?:struct)|(?:class)|(?:union)|(?:enum)))((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z))))*(?:((?:::)?(?:(?!\\b(?:__has_cpp_attribute|reinterpret_cast|atomic_noexcept|atomic_commit|atomic_cancel|__has_include|thread_local|dynamic_cast|synchronized|static_cast|const_cast|consteval|co_return|protected|constinit|constexpr|co_return|consteval|namespace|constexpr|constexpr|co_await|explicit|volatile|noexcept|co_yield|noexcept|noexcept|requires|typename|decltype|operator|template|continue|co_await|co_yield|volatile|register|restrict|reflexpr|mutable|alignof|include|private|defined|typedef|_Pragma|__asm__|concept|mutable|warning|default|virtual|alignas|public|sizeof|delete|not_eq|bitand|and_eq|xor_eq|typeid|switch|return|struct|static|extern|inline|friend|ifndef|define|pragma|export|import|module|catch|throw|const|or_eq|compl|while|ifdef|const|bitor|union|class|undef|error|break|using|endif|goto|line|enum|this|case|else|elif|else|not|try|for|asm|and|xor|new|do|if|or|if)\\b)(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<18>?)+>)(?:\\s)*+)?::)*+)((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z))))?(?!(?:(?:transaction_safe_dynamic)|(?:__has_cpp_attribute)|(?:reinterpret_cast)|(?:transaction_safe)|(?:atomic_noexcept)|(?:atomic_commit)|(?:__has_include)|(?:atomic_cancel)|(?:synchronized)|(?:thread_local)|(?:dynamic_cast)|(?:static_cast)|(?:const_cast)|(?:constexpr)|(?:co_return)|(?:constinit)|(?:namespace)|(?:protected)|(?:consteval)|(?:constexpr)|(?:constexpr)|(?:co_return)|(?:consteval)|(?:co_await)|(?:continue)|(?:template)|(?:reflexpr)|(?:volatile)|(?:register)|(?:co_await)|(?:co_yield)|(?:restrict)|(?:noexcept)|(?:volatile)|(?:override)|(?:explicit)|(?:decltype)|(?:operator)|(?:noexcept)|(?:noexcept)|(?:typename)|(?:requires)|(?:co_yield)|(?:nullptr)|(?:alignof)|(?:alignas)|(?:default)|(?:mutable)|(?:virtual)|(?:mutable)|(?:private)|(?:include)|(?:warning)|(?:_Pragma)|(?:defined)|(?:typedef)|(?:__asm__)|(?:concept)|(?:define)|(?:module)|(?:sizeof)|(?:switch)|(?:delete)|(?:pragma)|(?:and_eq)|(?:inline)|(?:xor_eq)|(?:typeid)|(?:import)|(?:extern)|(?:public)|(?:bitand)|(?:static)|(?:export)|(?:return)|(?:friend)|(?:ifndef)|(?:not_eq)|(?:false)|(?:final)|(?:break)|(?:const)|(?:catch)|(?:endif)|(?:ifdef)|(?:undef)|(?:error)|(?:audit)|(?:while)|(?:using)|(?:axiom)|(?:or_eq)|(?:compl)|(?:throw)|(?:bitor)|(?:const)|(?:line)|(?:case)|(?:else)|(?:this)|(?:true)|(?:goto)|(?:else)|(?:NULL)|(?:elif)|(?:new)|(?:asm)|(?:xor)|(?:and)|(?:try)|(?:not)|(?:for)|(?:do)|(?:if)|(?:or)|(?:if))\\b)(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\b((?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<18>?)+>)?(?![\\w<:.]))(((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))?(?:(?:&|(?:\\*))((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z))))*(?:&|(?:\\*)))?((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(\\()(\\*)(?:(?:\\s)+)?((?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)?)(?:(?:\\s)+)?(?:(\\[)(\\w*)(\\])(?:(?:\\s)+)?)*(\\))(?:(?:\\s)+)?(\\()", + "end": "(\\))((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(?=[{=,);>]|\\n)(?!\\()", "beginCaptures": { "1": { "name": "meta.qualified_type.cpp", @@ -5486,16 +4685,7 @@ "name": "comment.block.cpp" }, "6": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "7": { "patterns": [ @@ -5511,16 +4701,7 @@ "name": "comment.block.cpp" }, "10": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "11": { "patterns": [ @@ -5559,16 +4740,7 @@ "name": "comment.block.cpp" }, "17": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "18": {}, "19": { @@ -5578,7 +4750,7 @@ "name": "storage.modifier.pointer.cpp" }, { - "match": "(?:\\&((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))){2,}\\&", + "match": "(?:\\&((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))){2,}\\&", "captures": { "1": { "patterns": [ @@ -5594,16 +4766,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } }, "name": "invalid.illegal.reference-type.cpp" @@ -5628,16 +4791,7 @@ "name": "comment.block.cpp" }, "23": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "24": { "patterns": [ @@ -5653,16 +4807,7 @@ "name": "comment.block.cpp" }, "27": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "28": { "patterns": [ @@ -5678,16 +4823,7 @@ "name": "comment.block.cpp" }, "31": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "32": { "name": "punctuation.section.parens.begin.bracket.round.function.pointer.cpp" @@ -5736,16 +4872,7 @@ "name": "comment.block.cpp" }, "5": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } }, "patterns": [ @@ -5755,8 +4882,8 @@ ] }, "function_pointer_parameter": { - "begin": "(\\s*+((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\s*\\(\\s*\\(.*?\\)\\s*\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(?:(?:(?:unsigned)|(?:signed)|(?:short)|(?:long))|(?:(?:struct)|(?:class)|(?:union)|(?:enum)))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*((?:::)?(?:(?!\\b(?:__has_cpp_attribute|reinterpret_cast|atomic_noexcept|atomic_commit|atomic_cancel|__has_include|thread_local|dynamic_cast|synchronized|static_cast|const_cast|consteval|co_return|protected|constinit|constexpr|co_return|consteval|namespace|constexpr|constexpr|co_await|explicit|volatile|noexcept|co_yield|noexcept|noexcept|requires|typename|decltype|operator|template|continue|co_await|co_yield|volatile|register|restrict|reflexpr|mutable|alignof|include|private|defined|typedef|_Pragma|__asm__|concept|mutable|warning|default|virtual|alignas|public|sizeof|delete|not_eq|bitand|and_eq|xor_eq|typeid|switch|return|struct|static|extern|inline|friend|ifndef|define|pragma|export|import|module|catch|throw|const|or_eq|compl|while|ifdef|const|bitor|union|class|undef|error|break|using|endif|goto|line|enum|this|case|else|elif|else|not|try|for|asm|and|xor|new|do|if|or|if)\\b)(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<18>?)+>)(?:\\s)*+)?::)*+)?((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?!(?:(?:transaction_safe_dynamic)|(?:__has_cpp_attribute)|(?:reinterpret_cast)|(?:transaction_safe)|(?:atomic_noexcept)|(?:atomic_commit)|(?:__has_include)|(?:atomic_cancel)|(?:synchronized)|(?:thread_local)|(?:dynamic_cast)|(?:static_cast)|(?:const_cast)|(?:constexpr)|(?:co_return)|(?:constinit)|(?:namespace)|(?:protected)|(?:consteval)|(?:constexpr)|(?:constexpr)|(?:co_return)|(?:consteval)|(?:co_await)|(?:continue)|(?:template)|(?:reflexpr)|(?:volatile)|(?:register)|(?:co_await)|(?:co_yield)|(?:restrict)|(?:noexcept)|(?:volatile)|(?:override)|(?:explicit)|(?:decltype)|(?:operator)|(?:noexcept)|(?:noexcept)|(?:typename)|(?:requires)|(?:co_yield)|(?:nullptr)|(?:alignof)|(?:alignas)|(?:default)|(?:mutable)|(?:virtual)|(?:mutable)|(?:private)|(?:include)|(?:warning)|(?:_Pragma)|(?:defined)|(?:typedef)|(?:__asm__)|(?:concept)|(?:define)|(?:module)|(?:sizeof)|(?:switch)|(?:delete)|(?:pragma)|(?:and_eq)|(?:inline)|(?:xor_eq)|(?:typeid)|(?:import)|(?:extern)|(?:public)|(?:bitand)|(?:static)|(?:export)|(?:return)|(?:friend)|(?:ifndef)|(?:not_eq)|(?:false)|(?:final)|(?:break)|(?:const)|(?:catch)|(?:endif)|(?:ifdef)|(?:undef)|(?:error)|(?:audit)|(?:while)|(?:using)|(?:axiom)|(?:or_eq)|(?:compl)|(?:throw)|(?:bitor)|(?:const)|(?:line)|(?:case)|(?:else)|(?:this)|(?:true)|(?:goto)|(?:else)|(?:NULL)|(?:elif)|(?:new)|(?:asm)|(?:xor)|(?:and)|(?:try)|(?:not)|(?:for)|(?:do)|(?:if)|(?:or)|(?:if))\\b)(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\b((?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<18>?)+>)?(?![\\w<:.]))(((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))?(?:(?:&|(?:\\*))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*(?:&|(?:\\*)))?((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(\\()(\\*)(?:(?:\\s)+)?((?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)?)(?:(?:\\s)+)?(?:(\\[)(\\w*)(\\])(?:(?:\\s)+)?)*(\\))(?:(?:\\s)+)?(\\()", - "end": "(\\))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?=[{=,);>]|\\n)(?!\\()", + "begin": "(\\s*+((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\s*\\(\\s*\\(.*?\\)\\s*\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(?:(?:(?:(?:unsigned)|(?:signed)|(?:short)|(?:long))|(?:(?:struct)|(?:class)|(?:union)|(?:enum)))((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z))))*(?:((?:::)?(?:(?!\\b(?:__has_cpp_attribute|reinterpret_cast|atomic_noexcept|atomic_commit|atomic_cancel|__has_include|thread_local|dynamic_cast|synchronized|static_cast|const_cast|consteval|co_return|protected|constinit|constexpr|co_return|consteval|namespace|constexpr|constexpr|co_await|explicit|volatile|noexcept|co_yield|noexcept|noexcept|requires|typename|decltype|operator|template|continue|co_await|co_yield|volatile|register|restrict|reflexpr|mutable|alignof|include|private|defined|typedef|_Pragma|__asm__|concept|mutable|warning|default|virtual|alignas|public|sizeof|delete|not_eq|bitand|and_eq|xor_eq|typeid|switch|return|struct|static|extern|inline|friend|ifndef|define|pragma|export|import|module|catch|throw|const|or_eq|compl|while|ifdef|const|bitor|union|class|undef|error|break|using|endif|goto|line|enum|this|case|else|elif|else|not|try|for|asm|and|xor|new|do|if|or|if)\\b)(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<18>?)+>)(?:\\s)*+)?::)*+)((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z))))?(?!(?:(?:transaction_safe_dynamic)|(?:__has_cpp_attribute)|(?:reinterpret_cast)|(?:transaction_safe)|(?:atomic_noexcept)|(?:atomic_commit)|(?:__has_include)|(?:atomic_cancel)|(?:synchronized)|(?:thread_local)|(?:dynamic_cast)|(?:static_cast)|(?:const_cast)|(?:constexpr)|(?:co_return)|(?:constinit)|(?:namespace)|(?:protected)|(?:consteval)|(?:constexpr)|(?:constexpr)|(?:co_return)|(?:consteval)|(?:co_await)|(?:continue)|(?:template)|(?:reflexpr)|(?:volatile)|(?:register)|(?:co_await)|(?:co_yield)|(?:restrict)|(?:noexcept)|(?:volatile)|(?:override)|(?:explicit)|(?:decltype)|(?:operator)|(?:noexcept)|(?:noexcept)|(?:typename)|(?:requires)|(?:co_yield)|(?:nullptr)|(?:alignof)|(?:alignas)|(?:default)|(?:mutable)|(?:virtual)|(?:mutable)|(?:private)|(?:include)|(?:warning)|(?:_Pragma)|(?:defined)|(?:typedef)|(?:__asm__)|(?:concept)|(?:define)|(?:module)|(?:sizeof)|(?:switch)|(?:delete)|(?:pragma)|(?:and_eq)|(?:inline)|(?:xor_eq)|(?:typeid)|(?:import)|(?:extern)|(?:public)|(?:bitand)|(?:static)|(?:export)|(?:return)|(?:friend)|(?:ifndef)|(?:not_eq)|(?:false)|(?:final)|(?:break)|(?:const)|(?:catch)|(?:endif)|(?:ifdef)|(?:undef)|(?:error)|(?:audit)|(?:while)|(?:using)|(?:axiom)|(?:or_eq)|(?:compl)|(?:throw)|(?:bitor)|(?:const)|(?:line)|(?:case)|(?:else)|(?:this)|(?:true)|(?:goto)|(?:else)|(?:NULL)|(?:elif)|(?:new)|(?:asm)|(?:xor)|(?:and)|(?:try)|(?:not)|(?:for)|(?:do)|(?:if)|(?:or)|(?:if))\\b)(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\b((?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<18>?)+>)?(?![\\w<:.]))(((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))?(?:(?:&|(?:\\*))((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z))))*(?:&|(?:\\*)))?((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(\\()(\\*)(?:(?:\\s)+)?((?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)?)(?:(?:\\s)+)?(?:(\\[)(\\w*)(\\])(?:(?:\\s)+)?)*(\\))(?:(?:\\s)+)?(\\()", + "end": "(\\))((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(?=[{=,);>]|\\n)(?!\\()", "beginCaptures": { "1": { "name": "meta.qualified_type.cpp", @@ -5837,16 +4964,7 @@ "name": "comment.block.cpp" }, "6": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "7": { "patterns": [ @@ -5862,16 +4980,7 @@ "name": "comment.block.cpp" }, "10": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "11": { "patterns": [ @@ -5910,16 +5019,7 @@ "name": "comment.block.cpp" }, "17": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "18": {}, "19": { @@ -5929,7 +5029,7 @@ "name": "storage.modifier.pointer.cpp" }, { - "match": "(?:\\&((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))){2,}\\&", + "match": "(?:\\&((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))){2,}\\&", "captures": { "1": { "patterns": [ @@ -5945,16 +5045,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } }, "name": "invalid.illegal.reference-type.cpp" @@ -5979,16 +5070,7 @@ "name": "comment.block.cpp" }, "23": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "24": { "patterns": [ @@ -6004,16 +5086,7 @@ "name": "comment.block.cpp" }, "27": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "28": { "patterns": [ @@ -6029,16 +5102,7 @@ "name": "comment.block.cpp" }, "31": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "32": { "name": "punctuation.section.parens.begin.bracket.round.function.pointer.cpp" @@ -6087,16 +5151,7 @@ "name": "comment.block.cpp" }, "5": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } }, "patterns": [ @@ -6174,7 +5229,7 @@ ] }, "goto_statement": { - "match": "((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)", + "match": "((?:((?:\\s*+\\/\\*(?:[^\\*]++|\\*+(?!\\/))*+\\*\\/\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -6195,16 +5250,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -6223,7 +5269,7 @@ "5": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -6232,16 +5278,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -6256,7 +5293,7 @@ "match": "(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*" }, "include": { - "match": "^((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((#)(?:(?:\\s)+)?((?:include|include_next))\\b)(?:(?:\\s)+)?(?:(?:(?:((<)[^>]*(>?)((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(?:(?:\\n)|$)|(?=\\/\\/)))|((\\\")[^\\\"]*((?:\\\")?)((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(?:(?:\\n)|$)|(?=\\/\\/))))|(((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*(?:\\.(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)*((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(?:(?:\\n)|$)|(?=(?:\\/\\/|;)))))|((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(?:(?:\\n)|$)|(?=(?:\\/\\/|;))))", + "match": "^((?:((?:\\s*+\\/\\*(?:[^\\*]++|\\*+(?!\\/))*+\\*\\/\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))((#)(?:(?:\\s)+)?((?:include|include_next))\\b)(?:(?:\\s)+)?(?:(?:(?:((<)[^>]*(>?)((?:((?:\\s*+\\/\\*(?:[^\\*]++|\\*+(?!\\/))*+\\*\\/\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(?:(?:(?:\\n)|$)|(?=\\/\\/)))|((\\\")[^\\\"]*((?:\\\")?)((?:((?:\\s*+\\/\\*(?:[^\\*]++|\\*+(?!\\/))*+\\*\\/\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(?:(?:(?:\\n)|$)|(?=\\/\\/))))|(((?:((?:\\s*+\\/\\*(?:[^\\*]++|\\*+(?!\\/))*+\\*\\/\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*(?:\\.(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)*((?:((?:\\s*+\\/\\*(?:[^\\*]++|\\*+(?!\\/))*+\\*\\/\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(?:(?:(?:\\n)|$)|(?=(?:\\/\\/|;)))))|((?:((?:\\s*+\\/\\*(?:[^\\*]++|\\*+(?!\\/))*+\\*\\/\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(?:(?:(?:\\n)|$)|(?=(?:\\/\\/|;))))", "captures": { "1": { "patterns": [ @@ -6268,7 +5305,7 @@ "2": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -6277,16 +5314,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -6317,7 +5345,7 @@ "10": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -6326,16 +5354,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -6360,7 +5379,7 @@ "15": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -6369,16 +5388,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -6397,7 +5407,7 @@ "18": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -6406,16 +5416,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -6431,7 +5432,7 @@ "20": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -6440,16 +5441,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -6465,7 +5457,7 @@ "22": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -6474,16 +5466,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -6510,7 +5493,7 @@ "name": "storage.type.modifier.virtual.cpp" }, { - "match": "(?<=protected|virtual|private|public|,|:)(?:(?:\\s)+)?(?!(?:(?:(?:protected)|(?:private)|(?:public))|virtual))(\\s*+((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\s*\\(\\s*\\(.*?\\)\\s*\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(?:(?:(?:unsigned)|(?:signed)|(?:short)|(?:long))|(?:(?:struct)|(?:class)|(?:union)|(?:enum)))((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*((?:::)?(?:(?!\\b(?:__has_cpp_attribute|reinterpret_cast|atomic_noexcept|atomic_commit|atomic_cancel|__has_include|thread_local|dynamic_cast|synchronized|static_cast|const_cast|consteval|co_return|protected|constinit|constexpr|co_return|consteval|namespace|constexpr|constexpr|co_await|explicit|volatile|noexcept|co_yield|noexcept|noexcept|requires|typename|decltype|operator|template|continue|co_await|co_yield|volatile|register|restrict|reflexpr|mutable|alignof|include|private|defined|typedef|_Pragma|__asm__|concept|mutable|warning|default|virtual|alignas|public|sizeof|delete|not_eq|bitand|and_eq|xor_eq|typeid|switch|return|struct|static|extern|inline|friend|ifndef|define|pragma|export|import|module|catch|throw|const|or_eq|compl|while|ifdef|const|bitor|union|class|undef|error|break|using|endif|goto|line|enum|this|case|else|elif|else|not|try|for|asm|and|xor|new|do|if|or|if)\\b)(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<12>?)+>)(?:\\s)*+)?::)*+)?((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?!(?:(?:transaction_safe_dynamic)|(?:__has_cpp_attribute)|(?:reinterpret_cast)|(?:transaction_safe)|(?:atomic_noexcept)|(?:atomic_commit)|(?:__has_include)|(?:atomic_cancel)|(?:synchronized)|(?:thread_local)|(?:dynamic_cast)|(?:static_cast)|(?:const_cast)|(?:constexpr)|(?:co_return)|(?:constinit)|(?:namespace)|(?:protected)|(?:consteval)|(?:constexpr)|(?:constexpr)|(?:co_return)|(?:consteval)|(?:co_await)|(?:continue)|(?:template)|(?:reflexpr)|(?:volatile)|(?:register)|(?:co_await)|(?:co_yield)|(?:restrict)|(?:noexcept)|(?:volatile)|(?:override)|(?:explicit)|(?:decltype)|(?:operator)|(?:noexcept)|(?:noexcept)|(?:typename)|(?:requires)|(?:co_yield)|(?:nullptr)|(?:alignof)|(?:alignas)|(?:default)|(?:mutable)|(?:virtual)|(?:mutable)|(?:private)|(?:include)|(?:warning)|(?:_Pragma)|(?:defined)|(?:typedef)|(?:__asm__)|(?:concept)|(?:define)|(?:module)|(?:sizeof)|(?:switch)|(?:delete)|(?:pragma)|(?:and_eq)|(?:inline)|(?:xor_eq)|(?:typeid)|(?:import)|(?:extern)|(?:public)|(?:bitand)|(?:static)|(?:export)|(?:return)|(?:friend)|(?:ifndef)|(?:not_eq)|(?:false)|(?:final)|(?:break)|(?:const)|(?:catch)|(?:endif)|(?:ifdef)|(?:undef)|(?:error)|(?:audit)|(?:while)|(?:using)|(?:axiom)|(?:or_eq)|(?:compl)|(?:throw)|(?:bitor)|(?:const)|(?:line)|(?:case)|(?:else)|(?:this)|(?:true)|(?:goto)|(?:else)|(?:NULL)|(?:elif)|(?:new)|(?:asm)|(?:xor)|(?:and)|(?:try)|(?:not)|(?:for)|(?:do)|(?:if)|(?:or)|(?:if))\\b)(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\b((?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<12>?)+>)?(?![\\w<:.]))", + "match": "(?<=protected|virtual|private|public|,|:)(?:(?:\\s)+)?(?!(?:(?:(?:protected)|(?:private)|(?:public))|virtual))(\\s*+((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\s*\\(\\s*\\(.*?\\)\\s*\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?((?:((?:\\s*+\\/\\*(?:[^\\*]++|\\*+(?!\\/))*+\\*\\/\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(?:(?:(?:(?:unsigned)|(?:signed)|(?:short)|(?:long))|(?:(?:struct)|(?:class)|(?:union)|(?:enum)))((?:((?:\\s*+\\/\\*(?:[^\\*]++|\\*+(?!\\/))*+\\*\\/\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z))))*(?:((?:::)?(?:(?!\\b(?:__has_cpp_attribute|reinterpret_cast|atomic_noexcept|atomic_commit|atomic_cancel|__has_include|thread_local|dynamic_cast|synchronized|static_cast|const_cast|consteval|co_return|protected|constinit|constexpr|co_return|consteval|namespace|constexpr|constexpr|co_await|explicit|volatile|noexcept|co_yield|noexcept|noexcept|requires|typename|decltype|operator|template|continue|co_await|co_yield|volatile|register|restrict|reflexpr|mutable|alignof|include|private|defined|typedef|_Pragma|__asm__|concept|mutable|warning|default|virtual|alignas|public|sizeof|delete|not_eq|bitand|and_eq|xor_eq|typeid|switch|return|struct|static|extern|inline|friend|ifndef|define|pragma|export|import|module|catch|throw|const|or_eq|compl|while|ifdef|const|bitor|union|class|undef|error|break|using|endif|goto|line|enum|this|case|else|elif|else|not|try|for|asm|and|xor|new|do|if|or|if)\\b)(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<12>?)+>)(?:\\s)*+)?::)*+)((?:((?:\\s*+\\/\\*(?:[^\\*]++|\\*+(?!\\/))*+\\*\\/\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z))))?(?!(?:(?:transaction_safe_dynamic)|(?:__has_cpp_attribute)|(?:reinterpret_cast)|(?:transaction_safe)|(?:atomic_noexcept)|(?:atomic_commit)|(?:__has_include)|(?:atomic_cancel)|(?:synchronized)|(?:thread_local)|(?:dynamic_cast)|(?:static_cast)|(?:const_cast)|(?:constexpr)|(?:co_return)|(?:constinit)|(?:namespace)|(?:protected)|(?:consteval)|(?:constexpr)|(?:constexpr)|(?:co_return)|(?:consteval)|(?:co_await)|(?:continue)|(?:template)|(?:reflexpr)|(?:volatile)|(?:register)|(?:co_await)|(?:co_yield)|(?:restrict)|(?:noexcept)|(?:volatile)|(?:override)|(?:explicit)|(?:decltype)|(?:operator)|(?:noexcept)|(?:noexcept)|(?:typename)|(?:requires)|(?:co_yield)|(?:nullptr)|(?:alignof)|(?:alignas)|(?:default)|(?:mutable)|(?:virtual)|(?:mutable)|(?:private)|(?:include)|(?:warning)|(?:_Pragma)|(?:defined)|(?:typedef)|(?:__asm__)|(?:concept)|(?:define)|(?:module)|(?:sizeof)|(?:switch)|(?:delete)|(?:pragma)|(?:and_eq)|(?:inline)|(?:xor_eq)|(?:typeid)|(?:import)|(?:extern)|(?:public)|(?:bitand)|(?:static)|(?:export)|(?:return)|(?:friend)|(?:ifndef)|(?:not_eq)|(?:false)|(?:final)|(?:break)|(?:const)|(?:catch)|(?:endif)|(?:ifdef)|(?:undef)|(?:error)|(?:audit)|(?:while)|(?:using)|(?:axiom)|(?:or_eq)|(?:compl)|(?:throw)|(?:bitor)|(?:const)|(?:line)|(?:case)|(?:else)|(?:this)|(?:true)|(?:goto)|(?:else)|(?:NULL)|(?:elif)|(?:new)|(?:asm)|(?:xor)|(?:and)|(?:try)|(?:not)|(?:for)|(?:do)|(?:if)|(?:or)|(?:if))\\b)(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\b((?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<12>?)+>)?(?![\\w<:.]))", "captures": { "1": { "name": "meta.qualified_type.cpp", @@ -6587,7 +5570,7 @@ "4": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -6596,16 +5579,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -6621,7 +5595,7 @@ "6": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -6630,16 +5604,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -6678,7 +5643,7 @@ "11": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -6687,16 +5652,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -6725,7 +5681,7 @@ } }, "inline_comment": { - "match": "(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/))", + "match": "(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -6734,16 +5690,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } }, @@ -6752,7 +5699,7 @@ "name": "invalid.illegal.unexpected.punctuation.definition.comment.end.cpp" }, "label": { - "match": "((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(:)", + "match": "((?:((?:\\s*+\\/\\*(?:[^\\*]++|\\*+(?!\\/))*+\\*\\/\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -6773,16 +5720,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -6801,7 +5739,7 @@ "5": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -6810,16 +5748,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -6831,7 +5760,7 @@ } }, "lambdas": { - "begin": "(?:(?<=[^\\s]|^)(?])|(?<=\\Wreturn|^return))(?:(?:\\s)+)?(\\[(?!\\[| *+\"| *+\\d))((?:[^\\[\\]]|((??)++\\]))*+)(\\](?!((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))[\\[\\];]))", + "begin": "(?:(?<=[^\\s]|^)(?])|(?<=\\Wreturn|^return))(?:(?:\\s)+)?(\\[(?!\\[| *+\"| *+\\d))((?:[^\\[\\]]|((??)++\\]))*+)(\\](?!((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))[\\[\\];]))", "end": "(?<=[;}])", "beginCaptures": { "1": { @@ -6844,7 +5773,7 @@ "include": "#the_this_keyword" }, { - "match": "((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(?:(?=\\]|\\z|$)|(,))|(\\=))", + "match": "((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(?:(?:(?=\\]|\\z|$)|(,))|(\\=))", "captures": { "1": { "name": "variable.parameter.capture.cpp" @@ -6863,16 +5792,7 @@ "name": "comment.block.cpp" }, "5": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "6": { "name": "punctuation.separator.delimiter.comma.cpp" @@ -6905,16 +5825,7 @@ "name": "comment.block.cpp" }, "8": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } }, "endCaptures": {}, @@ -6989,7 +5900,7 @@ "name": "constant.language.$0.cpp" }, "line": { - "begin": "^((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(#)(?:(?:\\s)+)?line\\b", + "begin": "^((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(#)(?:(?:\\s)+)?line\\b", "end": "(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(#)(?:(?:\\s)+)?define\\b)(?:(?:\\s)+)?((?(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?\\*|->)))((?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*(?:(?:\\s)+)?(?:(?:\\.\\*|\\.)|(?:->\\*|->))(?:(?:\\s)+)?)*)(?:(?:\\s)+)?(\\b(?!uint_least32_t[^\\w]|uint_least16_t[^\\w]|uint_least64_t[^\\w]|int_least32_t[^\\w]|int_least64_t[^\\w]|uint_fast32_t[^\\w]|uint_fast64_t[^\\w]|uint_least8_t[^\\w]|uint_fast16_t[^\\w]|int_least16_t[^\\w]|int_fast16_t[^\\w]|int_least8_t[^\\w]|uint_fast8_t[^\\w]|int_fast64_t[^\\w]|int_fast32_t[^\\w]|int_fast8_t[^\\w]|suseconds_t[^\\w]|useconds_t[^\\w]|in_addr_t[^\\w]|uintmax_t[^\\w]|uintmax_t[^\\w]|uintmax_t[^\\w]|in_port_t[^\\w]|uintptr_t[^\\w]|blksize_t[^\\w]|uint32_t[^\\w]|uint64_t[^\\w]|u_quad_t[^\\w]|intmax_t[^\\w]|intmax_t[^\\w]|unsigned[^\\w]|blkcnt_t[^\\w]|uint16_t[^\\w]|intptr_t[^\\w]|swblk_t[^\\w]|wchar_t[^\\w]|u_short[^\\w]|qaddr_t[^\\w]|caddr_t[^\\w]|daddr_t[^\\w]|fixpt_t[^\\w]|nlink_t[^\\w]|segsz_t[^\\w]|clock_t[^\\w]|ssize_t[^\\w]|int16_t[^\\w]|int32_t[^\\w]|int64_t[^\\w]|uint8_t[^\\w]|int8_t[^\\w]|mode_t[^\\w]|quad_t[^\\w]|ushort[^\\w]|u_long[^\\w]|u_char[^\\w]|double[^\\w]|signed[^\\w]|time_t[^\\w]|size_t[^\\w]|key_t[^\\w]|div_t[^\\w]|ino_t[^\\w]|uid_t[^\\w]|gid_t[^\\w]|off_t[^\\w]|pid_t[^\\w]|float[^\\w]|dev_t[^\\w]|u_int[^\\w]|short[^\\w]|bool[^\\w]|id_t[^\\w]|uint[^\\w]|long[^\\w]|char[^\\w]|void[^\\w]|auto[^\\w]|id_t[^\\w]|int[^\\w])(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\b(?!\\())", + "match": "(?:((?:((?:\\s*+\\/\\*(?:[^\\*]++|\\*+(?!\\/))*+\\*\\/\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))((?\\*|->)))((?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*(?:(?:\\s)+)?(?:(?:\\.\\*|\\.)|(?:->\\*|->))(?:(?:\\s)+)?)*)(?:(?:\\s)+)?(\\b(?!uint_least32_t[^\\w]|uint_least16_t[^\\w]|uint_least64_t[^\\w]|int_least32_t[^\\w]|int_least64_t[^\\w]|uint_fast32_t[^\\w]|uint_fast64_t[^\\w]|uint_least8_t[^\\w]|uint_fast16_t[^\\w]|int_least16_t[^\\w]|int_fast16_t[^\\w]|int_least8_t[^\\w]|uint_fast8_t[^\\w]|int_fast64_t[^\\w]|int_fast32_t[^\\w]|int_fast8_t[^\\w]|suseconds_t[^\\w]|useconds_t[^\\w]|in_addr_t[^\\w]|uintmax_t[^\\w]|uintmax_t[^\\w]|uintmax_t[^\\w]|in_port_t[^\\w]|uintptr_t[^\\w]|blksize_t[^\\w]|uint32_t[^\\w]|uint64_t[^\\w]|u_quad_t[^\\w]|intmax_t[^\\w]|intmax_t[^\\w]|unsigned[^\\w]|blkcnt_t[^\\w]|uint16_t[^\\w]|intptr_t[^\\w]|swblk_t[^\\w]|wchar_t[^\\w]|u_short[^\\w]|qaddr_t[^\\w]|caddr_t[^\\w]|daddr_t[^\\w]|fixpt_t[^\\w]|nlink_t[^\\w]|segsz_t[^\\w]|clock_t[^\\w]|ssize_t[^\\w]|int16_t[^\\w]|int32_t[^\\w]|int64_t[^\\w]|uint8_t[^\\w]|int8_t[^\\w]|mode_t[^\\w]|quad_t[^\\w]|ushort[^\\w]|u_long[^\\w]|u_char[^\\w]|double[^\\w]|signed[^\\w]|time_t[^\\w]|size_t[^\\w]|key_t[^\\w]|div_t[^\\w]|ino_t[^\\w]|uid_t[^\\w]|gid_t[^\\w]|off_t[^\\w]|pid_t[^\\w]|float[^\\w]|dev_t[^\\w]|u_int[^\\w]|short[^\\w]|bool[^\\w]|id_t[^\\w]|uint[^\\w]|long[^\\w]|char[^\\w]|void[^\\w]|auto[^\\w]|id_t[^\\w]|int[^\\w])(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\b(?!\\())", "captures": { "1": { "patterns": [ @@ -7168,7 +6061,7 @@ "2": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -7177,16 +6070,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -7207,7 +6091,7 @@ "7": { "patterns": [ { - "match": "(?<=(?:\\.\\*|\\.|->|->\\*))(?:(?:\\s)+)?(?:((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?\\*|->)))", + "match": "(?<=(?:\\.\\*|\\.|->|->\\*))(?:(?:\\s)+)?(?:((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))((?\\*|->)))", "captures": { "1": { "patterns": [ @@ -7223,16 +6107,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "5": { "name": "variable.language.this.cpp" @@ -7249,7 +6124,7 @@ } }, { - "match": "(?:((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?\\*|->)))", + "match": "(?:((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))((?\\*|->)))", "captures": { "1": { "patterns": [ @@ -7265,16 +6140,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "5": { "name": "variable.language.this.cpp" @@ -7304,7 +6170,7 @@ } }, "memory_operators": { - "match": "((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?:(?:(delete)(?:(?:\\s)+)?(\\[\\])|(delete))|(new))(?!\\w))", + "match": "((?:((?:\\s*+\\/\\*(?:[^\\*]++|\\*+(?!\\/))*+\\*\\/\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))((?:(?:(delete)(?:(?:\\s)+)?(\\[\\])|(delete))|(new))(?!\\w))", "captures": { "1": { "patterns": [ @@ -7316,7 +6182,7 @@ "2": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -7325,16 +6191,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -7358,7 +6215,7 @@ } }, "method_access": { - "begin": "(?:((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?\\*|->)))((?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*(?:(?:\\s)+)?(?:(?:\\.\\*|\\.)|(?:->\\*|->))(?:(?:\\s)+)?)*)(?:(?:\\s)+)?(~?(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)(?:(?:\\s)+)?(\\()", + "begin": "(?:((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))((?\\*|->)))((?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*(?:(?:\\s)+)?(?:(?:\\.\\*|\\.)|(?:->\\*|->))(?:(?:\\s)+)?)*)(?:(?:\\s)+)?(~?(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)(?:(?:\\s)+)?(\\()", "end": "\\)", "beginCaptures": { "1": { @@ -7375,16 +6232,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "5": { "name": "variable.language.this.cpp" @@ -7401,7 +6249,7 @@ "9": { "patterns": [ { - "match": "(?<=(?:\\.\\*|\\.|->|->\\*))(?:(?:\\s)+)?(?:((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?\\*|->)))", + "match": "(?<=(?:\\.\\*|\\.|->|->\\*))(?:(?:\\s)+)?(?:((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))((?\\*|->)))", "captures": { "1": { "patterns": [ @@ -7417,16 +6265,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "5": { "name": "variable.language.this.cpp" @@ -7443,7 +6282,7 @@ } }, { - "match": "(?:((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?\\*|->)))", + "match": "(?:((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))((?\\*|->)))", "captures": { "1": { "patterns": [ @@ -7459,16 +6298,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "5": { "name": "variable.language.this.cpp" @@ -7511,7 +6341,7 @@ ] }, "misc_keywords": { - "match": "((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -7532,16 +6362,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -7753,7 +6574,7 @@ ] }, "noexcept_operator": { - "begin": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(\\()", + "begin": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(?:(?:(?:unsigned)|(?:signed)|(?:short)|(?:long))|(?:(?:struct)|(?:class)|(?:union)|(?:enum)))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*((?:::)?(?:(?!\\b(?:__has_cpp_attribute|reinterpret_cast|atomic_noexcept|atomic_commit|atomic_cancel|__has_include|thread_local|dynamic_cast|synchronized|static_cast|const_cast|consteval|co_return|protected|constinit|constexpr|co_return|consteval|namespace|constexpr|constexpr|co_await|explicit|volatile|noexcept|co_yield|noexcept|noexcept|requires|typename|decltype|operator|template|continue|co_await|co_yield|volatile|register|restrict|reflexpr|mutable|alignof|include|private|defined|typedef|_Pragma|__asm__|concept|mutable|warning|default|virtual|alignas|public|sizeof|delete|not_eq|bitand|and_eq|xor_eq|typeid|switch|return|struct|static|extern|inline|friend|ifndef|define|pragma|export|import|module|catch|throw|const|or_eq|compl|while|ifdef|const|bitor|union|class|undef|error|break|using|endif|goto|line|enum|this|case|else|elif|else|not|try|for|asm|and|xor|new|do|if|or|if)\\b)(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<55>?)+>)(?:\\s)*+)?::)*+)?((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?!(?:(?:transaction_safe_dynamic)|(?:__has_cpp_attribute)|(?:reinterpret_cast)|(?:transaction_safe)|(?:atomic_noexcept)|(?:atomic_commit)|(?:__has_include)|(?:atomic_cancel)|(?:synchronized)|(?:thread_local)|(?:dynamic_cast)|(?:static_cast)|(?:const_cast)|(?:constexpr)|(?:co_return)|(?:constinit)|(?:namespace)|(?:protected)|(?:consteval)|(?:constexpr)|(?:constexpr)|(?:co_return)|(?:consteval)|(?:co_await)|(?:continue)|(?:template)|(?:reflexpr)|(?:volatile)|(?:register)|(?:co_await)|(?:co_yield)|(?:restrict)|(?:noexcept)|(?:volatile)|(?:override)|(?:explicit)|(?:decltype)|(?:operator)|(?:noexcept)|(?:noexcept)|(?:typename)|(?:requires)|(?:co_yield)|(?:nullptr)|(?:alignof)|(?:alignas)|(?:default)|(?:mutable)|(?:virtual)|(?:mutable)|(?:private)|(?:include)|(?:warning)|(?:_Pragma)|(?:defined)|(?:typedef)|(?:__asm__)|(?:concept)|(?:define)|(?:module)|(?:sizeof)|(?:switch)|(?:delete)|(?:pragma)|(?:and_eq)|(?:inline)|(?:xor_eq)|(?:typeid)|(?:import)|(?:extern)|(?:public)|(?:bitand)|(?:static)|(?:export)|(?:return)|(?:friend)|(?:ifndef)|(?:not_eq)|(?:false)|(?:final)|(?:break)|(?:const)|(?:catch)|(?:endif)|(?:ifdef)|(?:undef)|(?:error)|(?:audit)|(?:while)|(?:using)|(?:axiom)|(?:or_eq)|(?:compl)|(?:throw)|(?:bitor)|(?:const)|(?:line)|(?:case)|(?:else)|(?:this)|(?:true)|(?:goto)|(?:else)|(?:NULL)|(?:elif)|(?:new)|(?:asm)|(?:xor)|(?:and)|(?:try)|(?:not)|(?:for)|(?:do)|(?:if)|(?:or)|(?:if))\\b)(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\b((?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<55>?)+>)?(?![\\w<:.]))(((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))?(?:(?:&|(?:\\*))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*(?:&|(?:\\*)))?((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))?((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?:__cdecl|__clrcall|__stdcall|__fastcall|__thiscall|__vectorcall)?)((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?:::)?(?:(?!\\b(?:__has_cpp_attribute|reinterpret_cast|atomic_noexcept|atomic_commit|atomic_cancel|__has_include|thread_local|dynamic_cast|synchronized|static_cast|const_cast|consteval|co_return|protected|constinit|constexpr|co_return|consteval|namespace|constexpr|constexpr|co_await|explicit|volatile|noexcept|co_yield|noexcept|noexcept|requires|typename|decltype|operator|template|continue|co_await|co_yield|volatile|register|restrict|reflexpr|mutable|alignof|include|private|defined|typedef|_Pragma|__asm__|concept|mutable|warning|default|virtual|alignas|public|sizeof|delete|not_eq|bitand|and_eq|xor_eq|typeid|switch|return|struct|static|extern|inline|friend|ifndef|define|pragma|export|import|module|catch|throw|const|or_eq|compl|while|ifdef|const|bitor|union|class|undef|error|break|using|endif|goto|line|enum|this|case|else|elif|else|not|try|for|asm|and|xor|new|do|if|or|if)\\b)(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<55>?)+>)(?:\\s)*+)?::)*+)(operator)((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?:::)?(?:(?!\\b(?:__has_cpp_attribute|reinterpret_cast|atomic_noexcept|atomic_commit|atomic_cancel|__has_include|thread_local|dynamic_cast|synchronized|static_cast|const_cast|consteval|co_return|protected|constinit|constexpr|co_return|consteval|namespace|constexpr|constexpr|co_await|explicit|volatile|noexcept|co_yield|noexcept|noexcept|requires|typename|decltype|operator|template|continue|co_await|co_yield|volatile|register|restrict|reflexpr|mutable|alignof|include|private|defined|typedef|_Pragma|__asm__|concept|mutable|warning|default|virtual|alignas|public|sizeof|delete|not_eq|bitand|and_eq|xor_eq|typeid|switch|return|struct|static|extern|inline|friend|ifndef|define|pragma|export|import|module|catch|throw|const|or_eq|compl|while|ifdef|const|bitor|union|class|undef|error|break|using|endif|goto|line|enum|this|case|else|elif|else|not|try|for|asm|and|xor|new|do|if|or|if)\\b)(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<55>?)+>)(?:\\s)*+)?::)*+)(?:(?:((?:(?:delete\\[\\])|(?:delete)|(?:new\\[\\])|(?:<=>)|(?:<<=)|(?:new)|(?:>>=)|(?:\\->\\*)|(?:\\/=)|(?:%=)|(?:&=)|(?:>=)|(?:\\|=)|(?:\\+\\+)|(?:\\-\\-)|(?:\\(\\))|(?:\\[\\])|(?:\\->)|(?:\\+\\+)|(?:<<)|(?:>>)|(?:\\-\\-)|(?:<=)|(?:\\^=)|(?:==)|(?:!=)|(?:&&)|(?:\\|\\|)|(?:\\+=)|(?:\\-=)|(?:\\*=)|,|(?:\\+)|(?:\\-)|!|~|(?:\\*)|&|(?:\\*)|(?:\\/)|%|(?:\\+)|(?:\\-)|<|>|&|(?:\\^)|(?:\\|)|=))|((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))?(?:(?:&|(?:\\*))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*(?:&|(?:\\*)))?((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?:\\[\\])?)))|(\"\")((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?=\\<|\\()", + "begin": "(?:(\\s*+((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\s*\\(\\s*\\(.*?\\)\\s*\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(?:(?:(?:(?:unsigned)|(?:signed)|(?:short)|(?:long))|(?:(?:struct)|(?:class)|(?:union)|(?:enum)))((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z))))*(?:((?:::)?(?:(?!\\b(?:__has_cpp_attribute|reinterpret_cast|atomic_noexcept|atomic_commit|atomic_cancel|__has_include|thread_local|dynamic_cast|synchronized|static_cast|const_cast|consteval|co_return|protected|constinit|constexpr|co_return|consteval|namespace|constexpr|constexpr|co_await|explicit|volatile|noexcept|co_yield|noexcept|noexcept|requires|typename|decltype|operator|template|continue|co_await|co_yield|volatile|register|restrict|reflexpr|mutable|alignof|include|private|defined|typedef|_Pragma|__asm__|concept|mutable|warning|default|virtual|alignas|public|sizeof|delete|not_eq|bitand|and_eq|xor_eq|typeid|switch|return|struct|static|extern|inline|friend|ifndef|define|pragma|export|import|module|catch|throw|const|or_eq|compl|while|ifdef|const|bitor|union|class|undef|error|break|using|endif|goto|line|enum|this|case|else|elif|else|not|try|for|asm|and|xor|new|do|if|or|if)\\b)(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<55>?)+>)(?:\\s)*+)?::)*+)((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z))))?(?!(?:(?:transaction_safe_dynamic)|(?:__has_cpp_attribute)|(?:reinterpret_cast)|(?:transaction_safe)|(?:atomic_noexcept)|(?:atomic_commit)|(?:__has_include)|(?:atomic_cancel)|(?:synchronized)|(?:thread_local)|(?:dynamic_cast)|(?:static_cast)|(?:const_cast)|(?:constexpr)|(?:co_return)|(?:constinit)|(?:namespace)|(?:protected)|(?:consteval)|(?:constexpr)|(?:constexpr)|(?:co_return)|(?:consteval)|(?:co_await)|(?:continue)|(?:template)|(?:reflexpr)|(?:volatile)|(?:register)|(?:co_await)|(?:co_yield)|(?:restrict)|(?:noexcept)|(?:volatile)|(?:override)|(?:explicit)|(?:decltype)|(?:operator)|(?:noexcept)|(?:noexcept)|(?:typename)|(?:requires)|(?:co_yield)|(?:nullptr)|(?:alignof)|(?:alignas)|(?:default)|(?:mutable)|(?:virtual)|(?:mutable)|(?:private)|(?:include)|(?:warning)|(?:_Pragma)|(?:defined)|(?:typedef)|(?:__asm__)|(?:concept)|(?:define)|(?:module)|(?:sizeof)|(?:switch)|(?:delete)|(?:pragma)|(?:and_eq)|(?:inline)|(?:xor_eq)|(?:typeid)|(?:import)|(?:extern)|(?:public)|(?:bitand)|(?:static)|(?:export)|(?:return)|(?:friend)|(?:ifndef)|(?:not_eq)|(?:false)|(?:final)|(?:break)|(?:const)|(?:catch)|(?:endif)|(?:ifdef)|(?:undef)|(?:error)|(?:audit)|(?:while)|(?:using)|(?:axiom)|(?:or_eq)|(?:compl)|(?:throw)|(?:bitor)|(?:const)|(?:line)|(?:case)|(?:else)|(?:this)|(?:true)|(?:goto)|(?:else)|(?:NULL)|(?:elif)|(?:new)|(?:asm)|(?:xor)|(?:and)|(?:try)|(?:not)|(?:for)|(?:do)|(?:if)|(?:or)|(?:if))\\b)(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\b((?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<55>?)+>)?(?![\\w<:.]))(((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))?(?:(?:&|(?:\\*))((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z))))*(?:&|(?:\\*)))?((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z))))?((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))((?:__cdecl|__clrcall|__stdcall|__fastcall|__thiscall|__vectorcall)?)((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))((?:::)?(?:(?!\\b(?:__has_cpp_attribute|reinterpret_cast|atomic_noexcept|atomic_commit|atomic_cancel|__has_include|thread_local|dynamic_cast|synchronized|static_cast|const_cast|consteval|co_return|protected|constinit|constexpr|co_return|consteval|namespace|constexpr|constexpr|co_await|explicit|volatile|noexcept|co_yield|noexcept|noexcept|requires|typename|decltype|operator|template|continue|co_await|co_yield|volatile|register|restrict|reflexpr|mutable|alignof|include|private|defined|typedef|_Pragma|__asm__|concept|mutable|warning|default|virtual|alignas|public|sizeof|delete|not_eq|bitand|and_eq|xor_eq|typeid|switch|return|struct|static|extern|inline|friend|ifndef|define|pragma|export|import|module|catch|throw|const|or_eq|compl|while|ifdef|const|bitor|union|class|undef|error|break|using|endif|goto|line|enum|this|case|else|elif|else|not|try|for|asm|and|xor|new|do|if|or|if)\\b)(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<55>?)+>)(?:\\s)*+)?::)*+)(operator)((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))((?:::)?(?:(?!\\b(?:__has_cpp_attribute|reinterpret_cast|atomic_noexcept|atomic_commit|atomic_cancel|__has_include|thread_local|dynamic_cast|synchronized|static_cast|const_cast|consteval|co_return|protected|constinit|constexpr|co_return|consteval|namespace|constexpr|constexpr|co_await|explicit|volatile|noexcept|co_yield|noexcept|noexcept|requires|typename|decltype|operator|template|continue|co_await|co_yield|volatile|register|restrict|reflexpr|mutable|alignof|include|private|defined|typedef|_Pragma|__asm__|concept|mutable|warning|default|virtual|alignas|public|sizeof|delete|not_eq|bitand|and_eq|xor_eq|typeid|switch|return|struct|static|extern|inline|friend|ifndef|define|pragma|export|import|module|catch|throw|const|or_eq|compl|while|ifdef|const|bitor|union|class|undef|error|break|using|endif|goto|line|enum|this|case|else|elif|else|not|try|for|asm|and|xor|new|do|if|or|if)\\b)(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<55>?)+>)(?:\\s)*+)?::)*+)(?:(?:((?:(?:delete\\[\\])|(?:delete)|(?:new\\[\\])|(?:<=>)|(?:<<=)|(?:new)|(?:>>=)|(?:\\->\\*)|(?:\\/=)|(?:%=)|(?:&=)|(?:>=)|(?:\\|=)|(?:\\+\\+)|(?:\\-\\-)|(?:\\(\\))|(?:\\[\\])|(?:\\->)|(?:\\+\\+)|(?:<<)|(?:>>)|(?:\\-\\-)|(?:<=)|(?:\\^=)|(?:==)|(?:!=)|(?:&&)|(?:\\|\\|)|(?:\\+=)|(?:\\-=)|(?:\\*=)|,|(?:\\+)|(?:\\-)|!|~|(?:\\*)|&|(?:\\*)|(?:\\/)|%|(?:\\+)|(?:\\-)|<|>|&|(?:\\^)|(?:\\|)|=))|((?|\\?\\?>)|(?=[;>\\[\\]=]))", "beginCaptures": { "0": { @@ -8159,16 +6971,7 @@ "name": "comment.block.cpp" }, "6": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "7": { "patterns": [ @@ -8184,16 +6987,7 @@ "name": "comment.block.cpp" }, "10": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "11": { "patterns": [ @@ -8232,16 +7026,7 @@ "name": "comment.block.cpp" }, "17": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "18": {}, "19": { @@ -8251,7 +7036,7 @@ "name": "storage.modifier.pointer.cpp" }, { - "match": "(?:\\&((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))){2,}\\&", + "match": "(?:\\&((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))){2,}\\&", "captures": { "1": { "patterns": [ @@ -8267,16 +7052,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } }, "name": "invalid.illegal.reference-type.cpp" @@ -8301,16 +7077,7 @@ "name": "comment.block.cpp" }, "23": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "24": { "patterns": [ @@ -8326,16 +7093,7 @@ "name": "comment.block.cpp" }, "27": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "28": { "patterns": [ @@ -8351,16 +7109,7 @@ "name": "comment.block.cpp" }, "31": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "32": { "patterns": [ @@ -8376,16 +7125,7 @@ "name": "comment.block.cpp" }, "35": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "36": { "name": "storage.type.modifier.calling-convention.cpp" @@ -8404,16 +7144,7 @@ "name": "comment.block.cpp" }, "40": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "41": { "patterns": [ @@ -8429,16 +7160,7 @@ "name": "comment.block.cpp" }, "44": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "45": { "patterns": [ @@ -8480,16 +7202,7 @@ "name": "comment.block.cpp" }, "52": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "53": { "patterns": [ @@ -8527,7 +7240,7 @@ "name": "entity.name.operator.type.pointer.cpp" }, { - "match": "(?:\\&((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))){2,}\\&", + "match": "(?:\\&((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))){2,}\\&", "captures": { "1": { "patterns": [ @@ -8543,16 +7256,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } }, "name": "invalid.illegal.reference-type.cpp" @@ -8577,16 +7281,7 @@ "name": "comment.block.cpp" }, "62": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "63": { "patterns": [ @@ -8602,16 +7297,7 @@ "name": "comment.block.cpp" }, "66": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "67": { "patterns": [ @@ -8627,16 +7313,7 @@ "name": "comment.block.cpp" }, "70": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "71": { "name": "entity.name.operator.type.array.cpp" @@ -8658,16 +7335,7 @@ "name": "comment.block.cpp" }, "76": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "77": { "name": "entity.name.operator.custom-literal.cpp" @@ -8686,16 +7354,7 @@ "name": "comment.block.cpp" }, "81": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } }, "endCaptures": {}, @@ -8745,7 +7404,7 @@ "include": "#qualifiers_and_specifiers_post_parameters" }, { - "match": "(\\=)((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(default)|(delete))", + "match": "(\\=)((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(?:(default)|(delete))", "captures": { "1": { "name": "keyword.operator.assignment.cpp" @@ -8764,16 +7423,7 @@ "name": "comment.block.cpp" }, "5": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "6": { "name": "keyword.other.default.function.cpp" @@ -8821,7 +7471,7 @@ "operators": { "patterns": [ { - "begin": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(\\()", + "begin": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(\\()", + "begin": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(\\()", + "begin": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(\\()", + "begin": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(\\()", + "begin": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(\\()", + "begin": "(\\bsizeof\\.\\.\\.)((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(\\()", "end": "\\)", "beginCaptures": { "1": { @@ -9081,16 +7686,7 @@ "name": "comment.block.cpp" }, "5": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "6": { "name": "punctuation.section.arguments.begin.bracket.round.operator.sizeof.variadic.cpp" @@ -9155,7 +7751,7 @@ "over_qualified_types": { "patterns": [ { - "match": "(\\bstruct)((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))?(?:(?:&|(?:\\*))((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*(?:&|(?:\\*)))((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))?((?:(?(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:\\[((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))\\]((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))?(?=,|\\)|\\n)", + "match": "(\\bstruct)((?:((?:\\s*+\\/\\*(?:[^\\*]++|\\*+(?!\\/))*+\\*\\/\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -9179,16 +7775,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -9207,7 +7794,7 @@ "6": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -9216,16 +7803,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -9238,7 +7816,7 @@ "name": "storage.modifier.pointer.cpp" }, { - "match": "(?:\\&((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))){2,}\\&", + "match": "(?:\\&((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))){2,}\\&", "captures": { "1": { "patterns": [ @@ -9254,16 +7832,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } }, "name": "invalid.illegal.reference-type.cpp" @@ -9284,7 +7853,7 @@ "9": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -9293,16 +7862,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -9318,7 +7878,7 @@ "11": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -9327,16 +7887,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -9352,7 +7903,7 @@ "13": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -9361,16 +7912,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -9389,7 +7931,7 @@ "16": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -9398,16 +7940,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -9423,7 +7956,7 @@ "18": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -9432,16 +7965,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -9457,7 +7981,7 @@ "20": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -9466,16 +7990,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -9484,7 +7999,7 @@ } }, { - "match": "(\\benum)((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))?(?:(?:&|(?:\\*))((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*(?:&|(?:\\*)))((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))?((?:(?(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:\\[((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))\\]((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))?(?=,|\\)|\\n)", + "match": "(\\benum)((?:((?:\\s*+\\/\\*(?:[^\\*]++|\\*+(?!\\/))*+\\*\\/\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -9508,16 +8023,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -9536,7 +8042,7 @@ "6": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -9545,16 +8051,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -9567,7 +8064,7 @@ "name": "storage.modifier.pointer.cpp" }, { - "match": "(?:\\&((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))){2,}\\&", + "match": "(?:\\&((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))){2,}\\&", "captures": { "1": { "patterns": [ @@ -9583,16 +8080,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } }, "name": "invalid.illegal.reference-type.cpp" @@ -9613,7 +8101,7 @@ "9": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -9622,16 +8110,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -9647,7 +8126,7 @@ "11": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -9656,16 +8135,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -9681,7 +8151,7 @@ "13": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -9690,16 +8160,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -9718,7 +8179,7 @@ "16": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -9727,16 +8188,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -9752,7 +8204,7 @@ "18": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -9761,16 +8213,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -9786,7 +8229,7 @@ "20": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -9795,16 +8238,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -9813,7 +8247,7 @@ } }, { - "match": "(\\bunion)((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))?(?:(?:&|(?:\\*))((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*(?:&|(?:\\*)))((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))?((?:(?(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:\\[((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))\\]((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))?(?=,|\\)|\\n)", + "match": "(\\bunion)((?:((?:\\s*+\\/\\*(?:[^\\*]++|\\*+(?!\\/))*+\\*\\/\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -9837,16 +8271,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -9865,7 +8290,7 @@ "6": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -9874,16 +8299,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -9896,7 +8312,7 @@ "name": "storage.modifier.pointer.cpp" }, { - "match": "(?:\\&((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))){2,}\\&", + "match": "(?:\\&((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))){2,}\\&", "captures": { "1": { "patterns": [ @@ -9912,16 +8328,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } }, "name": "invalid.illegal.reference-type.cpp" @@ -9942,7 +8349,7 @@ "9": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -9951,16 +8358,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -9976,7 +8374,7 @@ "11": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -9985,16 +8383,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -10010,7 +8399,7 @@ "13": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -10019,16 +8408,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -10047,7 +8427,7 @@ "16": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -10056,16 +8436,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -10081,7 +8452,7 @@ "18": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -10090,16 +8461,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -10115,7 +8477,7 @@ "20": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -10124,16 +8486,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -10142,7 +8495,7 @@ } }, { - "match": "(\\bclass)((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))?(?:(?:&|(?:\\*))((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*(?:&|(?:\\*)))((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))?((?:(?(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:\\[((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))\\]((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))?(?=,|\\)|\\n)", + "match": "(\\bclass)((?:((?:\\s*+\\/\\*(?:[^\\*]++|\\*+(?!\\/))*+\\*\\/\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -10166,16 +8519,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -10194,7 +8538,7 @@ "6": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -10203,16 +8547,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -10225,7 +8560,7 @@ "name": "storage.modifier.pointer.cpp" }, { - "match": "(?:\\&((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))){2,}\\&", + "match": "(?:\\&((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))){2,}\\&", "captures": { "1": { "patterns": [ @@ -10241,16 +8576,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } }, "name": "invalid.illegal.reference-type.cpp" @@ -10271,7 +8597,7 @@ "9": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -10280,16 +8606,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -10305,7 +8622,7 @@ "11": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -10314,16 +8631,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -10339,7 +8647,7 @@ "13": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -10348,16 +8656,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -10376,7 +8675,7 @@ "16": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -10385,16 +8684,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -10410,7 +8700,7 @@ "18": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -10419,16 +8709,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -10444,7 +8725,7 @@ "20": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -10453,16 +8734,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -10473,7 +8745,7 @@ ] }, "parameter": { - "begin": "((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?=\\w)", + "begin": "((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(?=\\w)", "end": "(?:(?=\\))|(,))", "beginCaptures": { "1": { @@ -10490,16 +8762,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } }, "endCaptures": { @@ -10512,6 +8775,9 @@ { "include": "#ever_present_context" }, + { + "include": "#string_context" + }, { "include": "#function_pointer_parameter" }, @@ -10522,7 +8788,7 @@ "include": "#vararg_ellipses" }, { - "match": "((?:((?:(?:thread_local)|(?:volatile)|(?:register)|(?:restrict)|(?:static)|(?:extern)|(?:const)))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))+)((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(?:\\s)*+(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?=,|\\)|=)", + "match": "((?:((?:(?:thread_local)|(?:volatile)|(?:register)|(?:restrict)|(?:static)|(?:extern)|(?:const)))((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z))))+)((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(?:(?:\\s)*+(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?=\\)|,|\\[|=|\\n)", + "match": "(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))?(?:(?:&|(?:\\*))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*(?:&|(?:\\*))", + "match": "((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))?(?:(?:&|(?:\\*))((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z))))*(?:&|(?:\\*))", "captures": { "0": { "patterns": [ @@ -10753,7 +8974,7 @@ "name": "storage.modifier.pointer.cpp" }, { - "match": "(?:\\&((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))){2,}\\&", + "match": "(?:\\&((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))){2,}\\&", "captures": { "1": { "patterns": [ @@ -10769,16 +8990,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } }, "name": "invalid.illegal.reference-type.cpp" @@ -10803,16 +9015,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "5": { "patterns": [ @@ -10828,23 +9031,14 @@ "name": "comment.block.cpp" }, "8": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } ] }, "parameter_class": { - "match": "(\\bclass)((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))?(?:(?:&|(?:\\*))((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*(?:&|(?:\\*)))((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))?((?:(?(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:\\[((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))\\]((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))?(?=,|\\)|\\n)", + "match": "(\\bclass)((?:((?:\\s*+\\/\\*(?:[^\\*]++|\\*+(?!\\/))*+\\*\\/\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -10868,16 +9062,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -10896,7 +9081,7 @@ "6": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -10905,16 +9090,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -10927,7 +9103,7 @@ "name": "storage.modifier.pointer.cpp" }, { - "match": "(?:\\&((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))){2,}\\&", + "match": "(?:\\&((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))){2,}\\&", "captures": { "1": { "patterns": [ @@ -10943,16 +9119,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } }, "name": "invalid.illegal.reference-type.cpp" @@ -10973,7 +9140,7 @@ "9": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -10982,16 +9149,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -11007,7 +9165,7 @@ "11": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -11016,16 +9174,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -11041,7 +9190,7 @@ "13": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -11050,16 +9199,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -11078,7 +9218,7 @@ "16": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -11087,16 +9227,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -11112,7 +9243,7 @@ "18": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -11121,16 +9252,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -11146,7 +9268,7 @@ "20": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -11155,16 +9277,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -11173,7 +9286,7 @@ } }, "parameter_enum": { - "match": "(\\benum)((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))?(?:(?:&|(?:\\*))((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*(?:&|(?:\\*)))((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))?((?:(?(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:\\[((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))\\]((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))?(?=,|\\)|\\n)", + "match": "(\\benum)((?:((?:\\s*+\\/\\*(?:[^\\*]++|\\*+(?!\\/))*+\\*\\/\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -11197,16 +9310,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -11225,7 +9329,7 @@ "6": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -11234,16 +9338,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -11256,7 +9351,7 @@ "name": "storage.modifier.pointer.cpp" }, { - "match": "(?:\\&((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))){2,}\\&", + "match": "(?:\\&((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))){2,}\\&", "captures": { "1": { "patterns": [ @@ -11272,16 +9367,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } }, "name": "invalid.illegal.reference-type.cpp" @@ -11302,7 +9388,7 @@ "9": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -11311,16 +9397,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -11336,7 +9413,7 @@ "11": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -11345,16 +9422,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -11370,7 +9438,7 @@ "13": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -11379,16 +9447,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -11407,7 +9466,7 @@ "16": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -11416,16 +9475,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -11441,7 +9491,7 @@ "18": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -11450,16 +9500,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -11475,7 +9516,7 @@ "20": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -11484,16 +9525,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -11502,7 +9534,7 @@ } }, "parameter_or_maybe_value": { - "begin": "((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?=\\w)", + "begin": "((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(?=\\w)", "end": "(?:(?=\\))|(,))", "beginCaptures": { "1": { @@ -11519,16 +9551,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } }, "endCaptures": { @@ -11560,7 +9583,7 @@ "include": "#vararg_ellipses" }, { - "match": "((?:((?:(?:thread_local)|(?:volatile)|(?:register)|(?:restrict)|(?:static)|(?:extern)|(?:const)))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))+)((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(?:\\s)*+(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?=,|\\)|=)", + "match": "((?:((?:(?:thread_local)|(?:volatile)|(?:register)|(?:restrict)|(?:static)|(?:extern)|(?:const)))((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z))))+)((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(?:(?:\\s)*+(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?=(?:\\)|,|\\[|=|\\/\\/|(?:(?:\\n)|$)))", + "match": "(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))?(?:(?:&|(?:\\*))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*(?:&|(?:\\*))", + "match": "((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))?(?:(?:&|(?:\\*))((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z))))*(?:&|(?:\\*))", "captures": { "0": { "patterns": [ @@ -11790,7 +9768,7 @@ "name": "storage.modifier.pointer.cpp" }, { - "match": "(?:\\&((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))){2,}\\&", + "match": "(?:\\&((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))){2,}\\&", "captures": { "1": { "patterns": [ @@ -11806,16 +9784,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } }, "name": "invalid.illegal.reference-type.cpp" @@ -11840,16 +9809,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "5": { "patterns": [ @@ -11865,16 +9825,7 @@ "name": "comment.block.cpp" }, "8": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } }, @@ -11884,7 +9835,7 @@ ] }, "parameter_struct": { - "match": "(\\bstruct)((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))?(?:(?:&|(?:\\*))((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*(?:&|(?:\\*)))((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))?((?:(?(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:\\[((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))\\]((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))?(?=,|\\)|\\n)", + "match": "(\\bstruct)((?:((?:\\s*+\\/\\*(?:[^\\*]++|\\*+(?!\\/))*+\\*\\/\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -11908,16 +9859,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -11936,7 +9878,7 @@ "6": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -11945,16 +9887,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -11967,7 +9900,7 @@ "name": "storage.modifier.pointer.cpp" }, { - "match": "(?:\\&((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))){2,}\\&", + "match": "(?:\\&((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))){2,}\\&", "captures": { "1": { "patterns": [ @@ -11983,16 +9916,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } }, "name": "invalid.illegal.reference-type.cpp" @@ -12013,7 +9937,7 @@ "9": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -12022,16 +9946,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -12047,7 +9962,7 @@ "11": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -12056,16 +9971,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -12081,7 +9987,7 @@ "13": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -12090,16 +9996,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -12118,7 +10015,7 @@ "16": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -12127,16 +10024,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -12152,7 +10040,7 @@ "18": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -12161,16 +10049,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -12186,7 +10065,7 @@ "20": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -12195,16 +10074,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -12213,7 +10083,7 @@ } }, "parameter_union": { - "match": "(\\bunion)((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))?(?:(?:&|(?:\\*))((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*(?:&|(?:\\*)))((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))?((?:(?(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:\\[((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))\\]((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))?(?=,|\\)|\\n)", + "match": "(\\bunion)((?:((?:\\s*+\\/\\*(?:[^\\*]++|\\*+(?!\\/))*+\\*\\/\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -12237,16 +10107,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -12265,7 +10126,7 @@ "6": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -12274,16 +10135,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -12296,7 +10148,7 @@ "name": "storage.modifier.pointer.cpp" }, { - "match": "(?:\\&((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))){2,}\\&", + "match": "(?:\\&((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))){2,}\\&", "captures": { "1": { "patterns": [ @@ -12312,16 +10164,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } }, "name": "invalid.illegal.reference-type.cpp" @@ -12342,7 +10185,7 @@ "9": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -12351,16 +10194,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -12376,7 +10210,7 @@ "11": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -12385,16 +10219,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -12410,7 +10235,7 @@ "13": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -12419,16 +10244,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -12447,7 +10263,7 @@ "16": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -12456,16 +10272,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -12481,7 +10288,7 @@ "18": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -12490,16 +10297,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -12515,7 +10313,7 @@ "20": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -12524,16 +10322,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -12569,7 +10358,7 @@ ] }, "pragma": { - "begin": "^((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(#)(?:(?:\\s)+)?pragma\\b", + "begin": "^((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(#)(?:(?:\\s)+)?pragma\\b", "end": "(?(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(#)(?:(?:\\s)+)?pragma(?:\\s)+mark)(?:\\s)+(.*)", + "match": "(^((?:((?:\\s*+\\/\\*(?:[^\\*]++|\\*+(?!\\/))*+\\*\\/\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(#)(?:(?:\\s)+)?pragma(?:\\s)+mark)(?:\\s)+(.*)", "captures": { "1": { "name": "keyword.control.directive.pragma.pragma-mark.cpp" @@ -12641,7 +10421,7 @@ "3": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -12650,16 +10430,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -12759,7 +10530,7 @@ "name": "meta.parens.preprocessor.conditional.cpp" }, "preprocessor_conditional_range": { - "begin": "^((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(#)(?:(?:\\s)+)?((?:(?:ifndef|ifdef)|if))", + "begin": "^((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(#)(?:(?:\\s)+)?((?:(?:ifndef|ifdef)|if))", "end": "^(?!\\s*+#\\s*(?:else|endif))", "beginCaptures": { "0": { @@ -12779,16 +10550,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "5": { "name": "punctuation.definition.directive.cpp" @@ -12815,7 +10577,7 @@ ] }, "preprocessor_conditional_standalone": { - "match": "^((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(#)(?:(?:\\s)+)?((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -12836,16 +10598,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -12895,7 +10648,7 @@ ] }, "qualified_type": { - "match": "\\s*+((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\s*\\(\\s*\\(.*?\\)\\s*\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(?:(?:(?:unsigned)|(?:signed)|(?:short)|(?:long))|(?:(?:struct)|(?:class)|(?:union)|(?:enum)))((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*((?:::)?(?:(?!\\b(?:__has_cpp_attribute|reinterpret_cast|atomic_noexcept|atomic_commit|atomic_cancel|__has_include|thread_local|dynamic_cast|synchronized|static_cast|const_cast|consteval|co_return|protected|constinit|constexpr|co_return|consteval|namespace|constexpr|constexpr|co_await|explicit|volatile|noexcept|co_yield|noexcept|noexcept|requires|typename|decltype|operator|template|continue|co_await|co_yield|volatile|register|restrict|reflexpr|mutable|alignof|include|private|defined|typedef|_Pragma|__asm__|concept|mutable|warning|default|virtual|alignas|public|sizeof|delete|not_eq|bitand|and_eq|xor_eq|typeid|switch|return|struct|static|extern|inline|friend|ifndef|define|pragma|export|import|module|catch|throw|const|or_eq|compl|while|ifdef|const|bitor|union|class|undef|error|break|using|endif|goto|line|enum|this|case|else|elif|else|not|try|for|asm|and|xor|new|do|if|or|if)\\b)(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<11>?)+>)(?:\\s)*+)?::)*+)?((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?!(?:(?:transaction_safe_dynamic)|(?:__has_cpp_attribute)|(?:reinterpret_cast)|(?:transaction_safe)|(?:atomic_noexcept)|(?:atomic_commit)|(?:__has_include)|(?:atomic_cancel)|(?:synchronized)|(?:thread_local)|(?:dynamic_cast)|(?:static_cast)|(?:const_cast)|(?:constexpr)|(?:co_return)|(?:constinit)|(?:namespace)|(?:protected)|(?:consteval)|(?:constexpr)|(?:constexpr)|(?:co_return)|(?:consteval)|(?:co_await)|(?:continue)|(?:template)|(?:reflexpr)|(?:volatile)|(?:register)|(?:co_await)|(?:co_yield)|(?:restrict)|(?:noexcept)|(?:volatile)|(?:override)|(?:explicit)|(?:decltype)|(?:operator)|(?:noexcept)|(?:noexcept)|(?:typename)|(?:requires)|(?:co_yield)|(?:nullptr)|(?:alignof)|(?:alignas)|(?:default)|(?:mutable)|(?:virtual)|(?:mutable)|(?:private)|(?:include)|(?:warning)|(?:_Pragma)|(?:defined)|(?:typedef)|(?:__asm__)|(?:concept)|(?:define)|(?:module)|(?:sizeof)|(?:switch)|(?:delete)|(?:pragma)|(?:and_eq)|(?:inline)|(?:xor_eq)|(?:typeid)|(?:import)|(?:extern)|(?:public)|(?:bitand)|(?:static)|(?:export)|(?:return)|(?:friend)|(?:ifndef)|(?:not_eq)|(?:false)|(?:final)|(?:break)|(?:const)|(?:catch)|(?:endif)|(?:ifdef)|(?:undef)|(?:error)|(?:audit)|(?:while)|(?:using)|(?:axiom)|(?:or_eq)|(?:compl)|(?:throw)|(?:bitor)|(?:const)|(?:line)|(?:case)|(?:else)|(?:this)|(?:true)|(?:goto)|(?:else)|(?:NULL)|(?:elif)|(?:new)|(?:asm)|(?:xor)|(?:and)|(?:try)|(?:not)|(?:for)|(?:do)|(?:if)|(?:or)|(?:if))\\b)(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\b((?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<11>?)+>)?(?![\\w<:.])", + "match": "\\s*+((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\s*\\(\\s*\\(.*?\\)\\s*\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?((?:((?:\\s*+\\/\\*(?:[^\\*]++|\\*+(?!\\/))*+\\*\\/\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(?:(?:(?:(?:unsigned)|(?:signed)|(?:short)|(?:long))|(?:(?:struct)|(?:class)|(?:union)|(?:enum)))((?:((?:\\s*+\\/\\*(?:[^\\*]++|\\*+(?!\\/))*+\\*\\/\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z))))*(?:((?:::)?(?:(?!\\b(?:__has_cpp_attribute|reinterpret_cast|atomic_noexcept|atomic_commit|atomic_cancel|__has_include|thread_local|dynamic_cast|synchronized|static_cast|const_cast|consteval|co_return|protected|constinit|constexpr|co_return|consteval|namespace|constexpr|constexpr|co_await|explicit|volatile|noexcept|co_yield|noexcept|noexcept|requires|typename|decltype|operator|template|continue|co_await|co_yield|volatile|register|restrict|reflexpr|mutable|alignof|include|private|defined|typedef|_Pragma|__asm__|concept|mutable|warning|default|virtual|alignas|public|sizeof|delete|not_eq|bitand|and_eq|xor_eq|typeid|switch|return|struct|static|extern|inline|friend|ifndef|define|pragma|export|import|module|catch|throw|const|or_eq|compl|while|ifdef|const|bitor|union|class|undef|error|break|using|endif|goto|line|enum|this|case|else|elif|else|not|try|for|asm|and|xor|new|do|if|or|if)\\b)(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<11>?)+>)(?:\\s)*+)?::)*+)((?:((?:\\s*+\\/\\*(?:[^\\*]++|\\*+(?!\\/))*+\\*\\/\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z))))?(?!(?:(?:transaction_safe_dynamic)|(?:__has_cpp_attribute)|(?:reinterpret_cast)|(?:transaction_safe)|(?:atomic_noexcept)|(?:atomic_commit)|(?:__has_include)|(?:atomic_cancel)|(?:synchronized)|(?:thread_local)|(?:dynamic_cast)|(?:static_cast)|(?:const_cast)|(?:constexpr)|(?:co_return)|(?:constinit)|(?:namespace)|(?:protected)|(?:consteval)|(?:constexpr)|(?:constexpr)|(?:co_return)|(?:consteval)|(?:co_await)|(?:continue)|(?:template)|(?:reflexpr)|(?:volatile)|(?:register)|(?:co_await)|(?:co_yield)|(?:restrict)|(?:noexcept)|(?:volatile)|(?:override)|(?:explicit)|(?:decltype)|(?:operator)|(?:noexcept)|(?:noexcept)|(?:typename)|(?:requires)|(?:co_yield)|(?:nullptr)|(?:alignof)|(?:alignas)|(?:default)|(?:mutable)|(?:virtual)|(?:mutable)|(?:private)|(?:include)|(?:warning)|(?:_Pragma)|(?:defined)|(?:typedef)|(?:__asm__)|(?:concept)|(?:define)|(?:module)|(?:sizeof)|(?:switch)|(?:delete)|(?:pragma)|(?:and_eq)|(?:inline)|(?:xor_eq)|(?:typeid)|(?:import)|(?:extern)|(?:public)|(?:bitand)|(?:static)|(?:export)|(?:return)|(?:friend)|(?:ifndef)|(?:not_eq)|(?:false)|(?:final)|(?:break)|(?:const)|(?:catch)|(?:endif)|(?:ifdef)|(?:undef)|(?:error)|(?:audit)|(?:while)|(?:using)|(?:axiom)|(?:or_eq)|(?:compl)|(?:throw)|(?:bitor)|(?:const)|(?:line)|(?:case)|(?:else)|(?:this)|(?:true)|(?:goto)|(?:else)|(?:NULL)|(?:elif)|(?:new)|(?:asm)|(?:xor)|(?:and)|(?:try)|(?:not)|(?:for)|(?:do)|(?:if)|(?:or)|(?:if))\\b)(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\b((?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<11>?)+>)?(?![\\w<:.])", "captures": { "0": { "patterns": [ @@ -12971,7 +10724,7 @@ "3": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -12980,16 +10733,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -13005,7 +10749,7 @@ "5": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -13014,16 +10758,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -13061,7 +10796,7 @@ "10": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -13070,16 +10805,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -13089,12 +10815,12 @@ "name": "meta.qualified_type.cpp" }, "qualifiers_and_specifiers_post_parameters": { - "match": "((?:(?:(?:(?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(?:(?:(?:unsigned)|(?:signed)|(?:short)|(?:long))|(?:(?:struct)|(?:class)|(?:union)|(?:enum)))((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*((?:::)?(?:(?!\\b(?:__has_cpp_attribute|reinterpret_cast|atomic_noexcept|atomic_commit|atomic_cancel|__has_include|thread_local|dynamic_cast|synchronized|static_cast|const_cast|consteval|co_return|protected|constinit|constexpr|co_return|consteval|namespace|constexpr|constexpr|co_await|explicit|volatile|noexcept|co_yield|noexcept|noexcept|requires|typename|decltype|operator|template|continue|co_await|co_yield|volatile|register|restrict|reflexpr|mutable|alignof|include|private|defined|typedef|_Pragma|__asm__|concept|mutable|warning|default|virtual|alignas|public|sizeof|delete|not_eq|bitand|and_eq|xor_eq|typeid|switch|return|struct|static|extern|inline|friend|ifndef|define|pragma|export|import|module|catch|throw|const|or_eq|compl|while|ifdef|const|bitor|union|class|undef|error|break|using|endif|goto|line|enum|this|case|else|elif|else|not|try|for|asm|and|xor|new|do|if|or|if)\\b)(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<12>?)+>)(?:\\s)*+)?::)*+)?((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?!(?:(?:transaction_safe_dynamic)|(?:__has_cpp_attribute)|(?:reinterpret_cast)|(?:transaction_safe)|(?:atomic_noexcept)|(?:atomic_commit)|(?:__has_include)|(?:atomic_cancel)|(?:synchronized)|(?:thread_local)|(?:dynamic_cast)|(?:static_cast)|(?:const_cast)|(?:constexpr)|(?:co_return)|(?:constinit)|(?:namespace)|(?:protected)|(?:consteval)|(?:constexpr)|(?:constexpr)|(?:co_return)|(?:consteval)|(?:co_await)|(?:continue)|(?:template)|(?:reflexpr)|(?:volatile)|(?:register)|(?:co_await)|(?:co_yield)|(?:restrict)|(?:noexcept)|(?:volatile)|(?:override)|(?:explicit)|(?:decltype)|(?:operator)|(?:noexcept)|(?:noexcept)|(?:typename)|(?:requires)|(?:co_yield)|(?:nullptr)|(?:alignof)|(?:alignas)|(?:default)|(?:mutable)|(?:virtual)|(?:mutable)|(?:private)|(?:include)|(?:warning)|(?:_Pragma)|(?:defined)|(?:typedef)|(?:__asm__)|(?:concept)|(?:define)|(?:module)|(?:sizeof)|(?:switch)|(?:delete)|(?:pragma)|(?:and_eq)|(?:inline)|(?:xor_eq)|(?:typeid)|(?:import)|(?:extern)|(?:public)|(?:bitand)|(?:static)|(?:export)|(?:return)|(?:friend)|(?:ifndef)|(?:not_eq)|(?:false)|(?:final)|(?:break)|(?:const)|(?:catch)|(?:endif)|(?:ifdef)|(?:undef)|(?:error)|(?:audit)|(?:while)|(?:using)|(?:axiom)|(?:or_eq)|(?:compl)|(?:throw)|(?:bitor)|(?:const)|(?:line)|(?:case)|(?:else)|(?:this)|(?:true)|(?:goto)|(?:else)|(?:NULL)|(?:elif)|(?:new)|(?:asm)|(?:xor)|(?:and)|(?:try)|(?:not)|(?:for)|(?:do)|(?:if)|(?:or)|(?:if))\\b)(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\b((?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<12>?)+>)?(?![\\w<:.]))(((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))?(?:(?:&|(?:\\*))((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*(?:&|(?:\\*)))?", + "match": "(\\s*+((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\s*\\(\\s*\\(.*?\\)\\s*\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?((?:((?:\\s*+\\/\\*(?:[^\\*]++|\\*+(?!\\/))*+\\*\\/\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(?:(?:(?:(?:unsigned)|(?:signed)|(?:short)|(?:long))|(?:(?:struct)|(?:class)|(?:union)|(?:enum)))((?:((?:\\s*+\\/\\*(?:[^\\*]++|\\*+(?!\\/))*+\\*\\/\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z))))*(?:((?:::)?(?:(?!\\b(?:__has_cpp_attribute|reinterpret_cast|atomic_noexcept|atomic_commit|atomic_cancel|__has_include|thread_local|dynamic_cast|synchronized|static_cast|const_cast|consteval|co_return|protected|constinit|constexpr|co_return|consteval|namespace|constexpr|constexpr|co_await|explicit|volatile|noexcept|co_yield|noexcept|noexcept|requires|typename|decltype|operator|template|continue|co_await|co_yield|volatile|register|restrict|reflexpr|mutable|alignof|include|private|defined|typedef|_Pragma|__asm__|concept|mutable|warning|default|virtual|alignas|public|sizeof|delete|not_eq|bitand|and_eq|xor_eq|typeid|switch|return|struct|static|extern|inline|friend|ifndef|define|pragma|export|import|module|catch|throw|const|or_eq|compl|while|ifdef|const|bitor|union|class|undef|error|break|using|endif|goto|line|enum|this|case|else|elif|else|not|try|for|asm|and|xor|new|do|if|or|if)\\b)(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<12>?)+>)(?:\\s)*+)?::)*+)((?:((?:\\s*+\\/\\*(?:[^\\*]++|\\*+(?!\\/))*+\\*\\/\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z))))?(?!(?:(?:transaction_safe_dynamic)|(?:__has_cpp_attribute)|(?:reinterpret_cast)|(?:transaction_safe)|(?:atomic_noexcept)|(?:atomic_commit)|(?:__has_include)|(?:atomic_cancel)|(?:synchronized)|(?:thread_local)|(?:dynamic_cast)|(?:static_cast)|(?:const_cast)|(?:constexpr)|(?:co_return)|(?:constinit)|(?:namespace)|(?:protected)|(?:consteval)|(?:constexpr)|(?:constexpr)|(?:co_return)|(?:consteval)|(?:co_await)|(?:continue)|(?:template)|(?:reflexpr)|(?:volatile)|(?:register)|(?:co_await)|(?:co_yield)|(?:restrict)|(?:noexcept)|(?:volatile)|(?:override)|(?:explicit)|(?:decltype)|(?:operator)|(?:noexcept)|(?:noexcept)|(?:typename)|(?:requires)|(?:co_yield)|(?:nullptr)|(?:alignof)|(?:alignas)|(?:default)|(?:mutable)|(?:virtual)|(?:mutable)|(?:private)|(?:include)|(?:warning)|(?:_Pragma)|(?:defined)|(?:typedef)|(?:__asm__)|(?:concept)|(?:define)|(?:module)|(?:sizeof)|(?:switch)|(?:delete)|(?:pragma)|(?:and_eq)|(?:inline)|(?:xor_eq)|(?:typeid)|(?:import)|(?:extern)|(?:public)|(?:bitand)|(?:static)|(?:export)|(?:return)|(?:friend)|(?:ifndef)|(?:not_eq)|(?:false)|(?:final)|(?:break)|(?:const)|(?:catch)|(?:endif)|(?:ifdef)|(?:undef)|(?:error)|(?:audit)|(?:while)|(?:using)|(?:axiom)|(?:or_eq)|(?:compl)|(?:throw)|(?:bitor)|(?:const)|(?:line)|(?:case)|(?:else)|(?:this)|(?:true)|(?:goto)|(?:else)|(?:NULL)|(?:elif)|(?:new)|(?:asm)|(?:xor)|(?:and)|(?:try)|(?:not)|(?:for)|(?:do)|(?:if)|(?:or)|(?:if))\\b)(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\b((?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<12>?)+>)?(?![\\w<:.]))(((?:((?:\\s*+\\/\\*(?:[^\\*]++|\\*+(?!\\/))*+\\*\\/\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))?(?:(?:&|(?:\\*))((?:((?:\\s*+\\/\\*(?:[^\\*]++|\\*+(?!\\/))*+\\*\\/\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z))))*(?:&|(?:\\*)))?", "captures": { "1": { "name": "meta.qualified_type.cpp", @@ -13812,7 +11529,7 @@ "4": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -13821,16 +11538,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -13846,7 +11554,7 @@ "6": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -13855,16 +11563,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -13903,7 +11602,7 @@ "11": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -13912,16 +11611,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -13935,7 +11625,7 @@ "name": "storage.modifier.pointer.cpp" }, { - "match": "(?:\\&((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))){2,}\\&", + "match": "(?:\\&((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))){2,}\\&", "captures": { "1": { "patterns": [ @@ -13951,16 +11641,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } }, "name": "invalid.illegal.reference-type.cpp" @@ -13981,7 +11662,7 @@ "15": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -13990,16 +11671,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -14015,7 +11687,7 @@ "17": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -14024,16 +11696,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -14042,7 +11705,7 @@ } }, "single_line_macro": { - "match": "^((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))#define.*(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -14073,16 +11736,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -14091,7 +11745,7 @@ } }, "sizeof_operator": { - "begin": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(\\()", + "begin": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(\\()", + "begin": "(\\bsizeof\\.\\.\\.)((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(\\()", "end": "\\)", "beginCaptures": { "1": { @@ -14159,16 +11804,7 @@ "name": "comment.block.cpp" }, "5": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "6": { "name": "punctuation.section.arguments.begin.bracket.round.operator.sizeof.variadic.cpp" @@ -14212,7 +11848,7 @@ "standard_declares": { "patterns": [ { - "match": "((?(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))?(?:(?:&|(?:\\*))((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*(?:&|(?:\\*)))?((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))\\b(?!override\\W|override\\$|final\\W|final\\$)((?(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?=\\S)(?![:{a-zA-Z])", + "match": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -14236,16 +11872,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -14261,7 +11888,7 @@ "name": "storage.modifier.pointer.cpp" }, { - "match": "(?:\\&((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))){2,}\\&", + "match": "(?:\\&((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))){2,}\\&", "captures": { "1": { "patterns": [ @@ -14277,16 +11904,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } }, "name": "invalid.illegal.reference-type.cpp" @@ -14307,7 +11925,7 @@ "7": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -14316,16 +11934,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -14341,7 +11950,7 @@ "9": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -14350,16 +11959,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -14375,7 +11975,7 @@ "11": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -14384,16 +11984,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -14412,7 +12003,7 @@ "14": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -14421,16 +12012,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -14439,7 +12021,7 @@ } }, { - "match": "((?(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))?(?:(?:&|(?:\\*))((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*(?:&|(?:\\*)))?((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))\\b(?!override\\W|override\\$|final\\W|final\\$)((?(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?=\\S)(?![:{a-zA-Z])", + "match": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -14463,16 +12045,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -14488,7 +12061,7 @@ "name": "storage.modifier.pointer.cpp" }, { - "match": "(?:\\&((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))){2,}\\&", + "match": "(?:\\&((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))){2,}\\&", "captures": { "1": { "patterns": [ @@ -14504,16 +12077,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } }, "name": "invalid.illegal.reference-type.cpp" @@ -14534,7 +12098,7 @@ "7": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -14543,16 +12107,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -14568,7 +12123,7 @@ "9": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -14577,16 +12132,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -14602,7 +12148,7 @@ "11": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -14611,16 +12157,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -14639,7 +12176,7 @@ "14": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -14648,16 +12185,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -14666,7 +12194,7 @@ } }, { - "match": "((?(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))?(?:(?:&|(?:\\*))((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*(?:&|(?:\\*)))?((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))\\b(?!override\\W|override\\$|final\\W|final\\$)((?(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?=\\S)(?![:{a-zA-Z])", + "match": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -14690,16 +12218,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -14715,7 +12234,7 @@ "name": "storage.modifier.pointer.cpp" }, { - "match": "(?:\\&((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))){2,}\\&", + "match": "(?:\\&((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))){2,}\\&", "captures": { "1": { "patterns": [ @@ -14731,16 +12250,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } }, "name": "invalid.illegal.reference-type.cpp" @@ -14761,7 +12271,7 @@ "7": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -14770,16 +12280,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -14795,7 +12296,7 @@ "9": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -14804,16 +12305,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -14829,7 +12321,7 @@ "11": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -14838,16 +12330,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -14866,7 +12349,7 @@ "14": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -14875,16 +12358,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -14893,7 +12367,7 @@ } }, { - "match": "((?(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))?(?:(?:&|(?:\\*))((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*(?:&|(?:\\*)))?((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))\\b(?!override\\W|override\\$|final\\W|final\\$)((?(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?=\\S)(?![:{a-zA-Z])", + "match": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -14917,16 +12391,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -14942,7 +12407,7 @@ "name": "storage.modifier.pointer.cpp" }, { - "match": "(?:\\&((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))){2,}\\&", + "match": "(?:\\&((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))){2,}\\&", "captures": { "1": { "patterns": [ @@ -14958,16 +12423,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } }, "name": "invalid.illegal.reference-type.cpp" @@ -14988,7 +12444,7 @@ "7": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -14997,16 +12453,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -15022,7 +12469,7 @@ "9": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -15031,16 +12478,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -15056,7 +12494,7 @@ "11": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -15065,16 +12503,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -15093,7 +12522,7 @@ "14": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -15102,16 +12531,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -15122,7 +12542,7 @@ ] }, "static_assert": { - "begin": "((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(\\()", + "begin": "((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))((?(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))", + "match": "(?:((?:\\s*+\\/\\*(?:[^\\*]++|\\*+(?!\\/))*+\\*\\/\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z))", "captures": { "0": { "patterns": [ @@ -15222,7 +12624,7 @@ "1": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -15231,16 +12633,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -15249,7 +12642,7 @@ } }, "storage_specifiers": { - "match": "((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -15270,16 +12663,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -15503,7 +12887,7 @@ ] }, "struct_block": { - "begin": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(?={)|(?:((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\s*\\(\\s*\\(.*?\\)\\s*\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))?((?:(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*+)?(?:((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(:(?!:)))?)", + "begin": "((?|\\?\\?>)(?:(?:\\s)+)?(;)|(;))|(?=[;>\\[\\]=]))", "beginCaptures": { "0": { @@ -15526,16 +12910,7 @@ "name": "comment.block.cpp" }, "5": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "6": { "patterns": [ @@ -15561,21 +12936,12 @@ "name": "comment.block.cpp" }, "10": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "11": { "patterns": [ { - "match": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))", + "match": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))?(?=:|{|$)", + "match": "((?(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))?(?:(?:&|(?:\\*))((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*(?:&|(?:\\*)))?((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))\\b(?!override\\W|override\\$|final\\W|final\\$)((?(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?=\\S)(?![:{a-zA-Z])", + "match": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -15831,16 +13152,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -15856,7 +13168,7 @@ "name": "storage.modifier.pointer.cpp" }, { - "match": "(?:\\&((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))){2,}\\&", + "match": "(?:\\&((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))){2,}\\&", "captures": { "1": { "patterns": [ @@ -15872,16 +13184,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } }, "name": "invalid.illegal.reference-type.cpp" @@ -15902,7 +13205,7 @@ "7": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -15911,16 +13214,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -15936,7 +13230,7 @@ "9": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -15945,16 +13239,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -15970,7 +13255,7 @@ "11": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -15979,16 +13264,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -16007,7 +13283,7 @@ "14": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -16016,16 +13292,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -16034,7 +13301,7 @@ } }, "switch_conditional_parentheses": { - "begin": "((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(\\()", + "begin": "((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(\\()", "end": "\\)", "beginCaptures": { "1": { @@ -16051,16 +13318,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "5": { "name": "punctuation.section.parens.begin.bracket.round.conditional.switch.cpp" @@ -16079,7 +13337,7 @@ ] }, "switch_statement": { - "begin": "((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?|\\?\\?>)|(?=[;>\\[\\]=]))", "beginCaptures": { "0": { @@ -16099,16 +13357,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "5": { "name": "keyword.control.switch.cpp" @@ -16296,7 +13545,7 @@ ] }, "template_definition_argument": { - "match": "((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(?:(?:((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)|((?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*(?:\\s)+)+)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*))|((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)(?:(?:\\s)+)?(\\.\\.\\.)(?:(?:\\s)+)?((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*))|(?)(?:(?:\\s)+)?(class|typename)(?:(?:\\s)+((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*))?)(?:(?:\\s)+)?(?:(\\=)(?:(?:\\s)+)?(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)?(?:(,)|(?=>|$))", + "match": "((?:((?:\\s*+\\/\\*(?:[^\\*]++|\\*+(?!\\/))*+\\*\\/\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(?:(?:(?:((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)|((?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*(?:\\s)+)+)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*))|((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)(?:(?:\\s)+)?(\\.\\.\\.)(?:(?:\\s)+)?((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*))|(?)(?:(?:\\s)+)?(class|typename)(?:(?:\\s)+((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*))?)(?:(?:\\s)+)?(?:(\\=)(?:(?:\\s)+)?(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)?(?:(,)|(?=>|$))", "captures": { "1": { "patterns": [ @@ -16308,7 +13557,7 @@ "2": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -16317,16 +13566,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -16403,6 +13643,18 @@ } ] }, + "template_explicit_instantiation": { + "match": "(?)(?:(?:\\s)+)?$", "captures": { @@ -16521,7 +13773,7 @@ "applyEndPatternLast": 1 }, "the_this_keyword": { - "match": "((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -16542,16 +13794,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -16563,65 +13806,13 @@ } }, "type_alias": { - "match": "(using)(?:(?:\\s)+)?(?!namespace)(\\s*+((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\s*\\(\\s*\\(.*?\\)\\s*\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(?:(?:(?:unsigned)|(?:signed)|(?:short)|(?:long))|(?:(?:struct)|(?:class)|(?:union)|(?:enum)))((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*((?:::)?(?:(?!\\b(?:__has_cpp_attribute|reinterpret_cast|atomic_noexcept|atomic_commit|atomic_cancel|__has_include|thread_local|dynamic_cast|synchronized|static_cast|const_cast|consteval|co_return|protected|constinit|constexpr|co_return|consteval|namespace|constexpr|constexpr|co_await|explicit|volatile|noexcept|co_yield|noexcept|noexcept|requires|typename|decltype|operator|template|continue|co_await|co_yield|volatile|register|restrict|reflexpr|mutable|alignof|include|private|defined|typedef|_Pragma|__asm__|concept|mutable|warning|default|virtual|alignas|public|sizeof|delete|not_eq|bitand|and_eq|xor_eq|typeid|switch|return|struct|static|extern|inline|friend|ifndef|define|pragma|export|import|module|catch|throw|const|or_eq|compl|while|ifdef|const|bitor|union|class|undef|error|break|using|endif|goto|line|enum|this|case|else|elif|else|not|try|for|asm|and|xor|new|do|if|or|if)\\b)(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<29>?)+>)(?:\\s)*+)?::)*+)?((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?!(?:(?:transaction_safe_dynamic)|(?:__has_cpp_attribute)|(?:reinterpret_cast)|(?:transaction_safe)|(?:atomic_noexcept)|(?:atomic_commit)|(?:__has_include)|(?:atomic_cancel)|(?:synchronized)|(?:thread_local)|(?:dynamic_cast)|(?:static_cast)|(?:const_cast)|(?:constexpr)|(?:co_return)|(?:constinit)|(?:namespace)|(?:protected)|(?:consteval)|(?:constexpr)|(?:constexpr)|(?:co_return)|(?:consteval)|(?:co_await)|(?:continue)|(?:template)|(?:reflexpr)|(?:volatile)|(?:register)|(?:co_await)|(?:co_yield)|(?:restrict)|(?:noexcept)|(?:volatile)|(?:override)|(?:explicit)|(?:decltype)|(?:operator)|(?:noexcept)|(?:noexcept)|(?:typename)|(?:requires)|(?:co_yield)|(?:nullptr)|(?:alignof)|(?:alignas)|(?:default)|(?:mutable)|(?:virtual)|(?:mutable)|(?:private)|(?:include)|(?:warning)|(?:_Pragma)|(?:defined)|(?:typedef)|(?:__asm__)|(?:concept)|(?:define)|(?:module)|(?:sizeof)|(?:switch)|(?:delete)|(?:pragma)|(?:and_eq)|(?:inline)|(?:xor_eq)|(?:typeid)|(?:import)|(?:extern)|(?:public)|(?:bitand)|(?:static)|(?:export)|(?:return)|(?:friend)|(?:ifndef)|(?:not_eq)|(?:false)|(?:final)|(?:break)|(?:const)|(?:catch)|(?:endif)|(?:ifdef)|(?:undef)|(?:error)|(?:audit)|(?:while)|(?:using)|(?:axiom)|(?:or_eq)|(?:compl)|(?:throw)|(?:bitor)|(?:const)|(?:line)|(?:case)|(?:else)|(?:this)|(?:true)|(?:goto)|(?:else)|(?:NULL)|(?:elif)|(?:new)|(?:asm)|(?:xor)|(?:and)|(?:try)|(?:not)|(?:for)|(?:do)|(?:if)|(?:or)|(?:if))\\b)(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\b((?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<29>?)+>)?(?![\\w<:.]))(?:(?:\\s)+)?(\\=)(?:(?:\\s)+)?((?:typename)?)(?:(?:\\s)+)?((?:(?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))(?(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(?:(?:(?:unsigned)|(?:signed)|(?:short)|(?:long))|(?:(?:struct)|(?:class)|(?:union)|(?:enum)))((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*((?:::)?(?:(?!\\b(?:__has_cpp_attribute|reinterpret_cast|atomic_noexcept|atomic_commit|atomic_cancel|__has_include|thread_local|dynamic_cast|synchronized|static_cast|const_cast|consteval|co_return|protected|constinit|constexpr|co_return|consteval|namespace|constexpr|constexpr|co_await|explicit|volatile|noexcept|co_yield|noexcept|noexcept|requires|typename|decltype|operator|template|continue|co_await|co_yield|volatile|register|restrict|reflexpr|mutable|alignof|include|private|defined|typedef|_Pragma|__asm__|concept|mutable|warning|default|virtual|alignas|public|sizeof|delete|not_eq|bitand|and_eq|xor_eq|typeid|switch|return|struct|static|extern|inline|friend|ifndef|define|pragma|export|import|module|catch|throw|const|or_eq|compl|while|ifdef|const|bitor|union|class|undef|error|break|using|endif|goto|line|enum|this|case|else|elif|else|not|try|for|asm|and|xor|new|do|if|or|if)\\b)(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<29>?)+>)(?:\\s)*+)?::)*+)?((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?!(?:(?:transaction_safe_dynamic)|(?:__has_cpp_attribute)|(?:reinterpret_cast)|(?:transaction_safe)|(?:atomic_noexcept)|(?:atomic_commit)|(?:__has_include)|(?:atomic_cancel)|(?:synchronized)|(?:thread_local)|(?:dynamic_cast)|(?:static_cast)|(?:const_cast)|(?:constexpr)|(?:co_return)|(?:constinit)|(?:namespace)|(?:protected)|(?:consteval)|(?:constexpr)|(?:constexpr)|(?:co_return)|(?:consteval)|(?:co_await)|(?:continue)|(?:template)|(?:reflexpr)|(?:volatile)|(?:register)|(?:co_await)|(?:co_yield)|(?:restrict)|(?:noexcept)|(?:volatile)|(?:override)|(?:explicit)|(?:decltype)|(?:operator)|(?:noexcept)|(?:noexcept)|(?:typename)|(?:requires)|(?:co_yield)|(?:nullptr)|(?:alignof)|(?:alignas)|(?:default)|(?:mutable)|(?:virtual)|(?:mutable)|(?:private)|(?:include)|(?:warning)|(?:_Pragma)|(?:defined)|(?:typedef)|(?:__asm__)|(?:concept)|(?:define)|(?:module)|(?:sizeof)|(?:switch)|(?:delete)|(?:pragma)|(?:and_eq)|(?:inline)|(?:xor_eq)|(?:typeid)|(?:import)|(?:extern)|(?:public)|(?:bitand)|(?:static)|(?:export)|(?:return)|(?:friend)|(?:ifndef)|(?:not_eq)|(?:false)|(?:final)|(?:break)|(?:const)|(?:catch)|(?:endif)|(?:ifdef)|(?:undef)|(?:error)|(?:audit)|(?:while)|(?:using)|(?:axiom)|(?:or_eq)|(?:compl)|(?:throw)|(?:bitor)|(?:const)|(?:line)|(?:case)|(?:else)|(?:this)|(?:true)|(?:goto)|(?:else)|(?:NULL)|(?:elif)|(?:new)|(?:asm)|(?:xor)|(?:and)|(?:try)|(?:not)|(?:for)|(?:do)|(?:if)|(?:or)|(?:if))\\b)(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\b((?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<29>?)+>)?(?![\\w<:.]))|(.*(?(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))?(?:(?:&|(?:\\*))((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*(?:&|(?:\\*)))((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))?(?:(\\[)(\\w*)(\\])(?:(?:\\s)+)?)?(?:(?:\\s)+)?(?:(;)|\\n)", + "match": "(using)(?:\\s)+(?!namespace)((?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)(?:(?:\\s)+)?((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\s*\\(\\s*\\(.*?\\)\\s*\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?(?:(?:\\s)+)?(\\=)(?:(?:\\s)+)?((?:typename)?)(?:(?:\\s)+)?((?:(?:((?:\\s*+\\/\\*(?:[^\\*]++|\\*+(?!\\/))*+\\*\\/\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z))(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<19>?)+>)(?:\\s)*+)?::)*+)((?:((?:\\s*+\\/\\*(?:[^\\*]++|\\*+(?!\\/))*+\\*\\/\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z))))?(?!(?:(?:transaction_safe_dynamic)|(?:__has_cpp_attribute)|(?:reinterpret_cast)|(?:transaction_safe)|(?:atomic_noexcept)|(?:atomic_commit)|(?:__has_include)|(?:atomic_cancel)|(?:synchronized)|(?:thread_local)|(?:dynamic_cast)|(?:static_cast)|(?:const_cast)|(?:constexpr)|(?:co_return)|(?:constinit)|(?:namespace)|(?:protected)|(?:consteval)|(?:constexpr)|(?:constexpr)|(?:co_return)|(?:consteval)|(?:co_await)|(?:continue)|(?:template)|(?:reflexpr)|(?:volatile)|(?:register)|(?:co_await)|(?:co_yield)|(?:restrict)|(?:noexcept)|(?:volatile)|(?:override)|(?:explicit)|(?:decltype)|(?:operator)|(?:noexcept)|(?:noexcept)|(?:typename)|(?:requires)|(?:co_yield)|(?:nullptr)|(?:alignof)|(?:alignas)|(?:default)|(?:mutable)|(?:virtual)|(?:mutable)|(?:private)|(?:include)|(?:warning)|(?:_Pragma)|(?:defined)|(?:typedef)|(?:__asm__)|(?:concept)|(?:define)|(?:module)|(?:sizeof)|(?:switch)|(?:delete)|(?:pragma)|(?:and_eq)|(?:inline)|(?:xor_eq)|(?:typeid)|(?:import)|(?:extern)|(?:public)|(?:bitand)|(?:static)|(?:export)|(?:return)|(?:friend)|(?:ifndef)|(?:not_eq)|(?:false)|(?:final)|(?:break)|(?:const)|(?:catch)|(?:endif)|(?:ifdef)|(?:undef)|(?:error)|(?:audit)|(?:while)|(?:using)|(?:axiom)|(?:or_eq)|(?:compl)|(?:throw)|(?:bitor)|(?:const)|(?:line)|(?:case)|(?:else)|(?:this)|(?:true)|(?:goto)|(?:else)|(?:NULL)|(?:elif)|(?:new)|(?:asm)|(?:xor)|(?:and)|(?:try)|(?:not)|(?:for)|(?:do)|(?:if)|(?:or)|(?:if))\\b)(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\b((?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<19>?)+>)?(?![\\w<:.]))|(.*(?", - "beginCaptures": { - "0": { - "name": "punctuation.section.angle-brackets.begin.template.call.cpp" - } - }, - "endCaptures": { - "0": { - "name": "punctuation.section.angle-brackets.end.template.call.cpp" - } - }, - "name": "meta.template.call.cpp", - "patterns": [ - { - "include": "#template_call_context" - } - ] - }, - { - "match": "(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*", - "name": "entity.name.type.cpp" - } - ] + "name": "entity.name.type.cpp" }, "3": { "patterns": [ @@ -16634,146 +13825,22 @@ ] }, "4": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "5": { - "patterns": [ - { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", - "captures": { - "1": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "2": { - "name": "comment.block.cpp" - }, - "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] - } - } - } - ] - }, - "6": { - "patterns": [ - { - "include": "#inline_comment" - } - ] - }, - "7": { - "patterns": [ - { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", - "captures": { - "1": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "2": { - "name": "comment.block.cpp" - }, - "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] - } - } - } - ] - }, - "8": { - "patterns": [ - { - "match": "::", - "name": "punctuation.separator.namespace.access.cpp punctuation.separator.scope-resolution.type.cpp" - }, - { - "match": "(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", - "captures": { - "1": { - "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" - }, - "2": { - "name": "comment.block.cpp" - }, - "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] - } - } - } - ] - }, - "14": { "name": "keyword.operator.assignment.cpp" }, - "15": { + "5": { "name": "keyword.other.typename.cpp" }, - "16": { + "6": { "patterns": [ { "include": "#storage_specifiers" } ] }, - "17": { + "7": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -16782,22 +13849,13 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } ] }, - "18": { + "8": { "name": "meta.qualified_type.cpp", "patterns": [ { @@ -16852,7 +13910,7 @@ } ] }, - "19": { + "9": { "patterns": [ { "include": "#attributes_context" @@ -16862,17 +13920,17 @@ } ] }, - "20": { + "10": { "patterns": [ { "include": "#inline_comment" } ] }, - "21": { + "11": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -16881,32 +13939,23 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } ] }, - "22": { + "12": { "patterns": [ { "include": "#inline_comment" } ] }, - "23": { + "13": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -16915,22 +13964,13 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } ] }, - "24": { + "14": { "patterns": [ { "match": "::", @@ -16945,24 +13985,24 @@ } ] }, - "25": { + "15": { "patterns": [ { "include": "#template_call_range" } ] }, - "27": { + "17": { "patterns": [ { "include": "#inline_comment" } ] }, - "28": { + "18": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -16971,22 +14011,13 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } ] }, - "30": { + "20": { "name": "meta.declaration.type.alias.value.unknown.cpp", "patterns": [ { @@ -16994,14 +14025,14 @@ } ] }, - "31": { + "21": { "patterns": [ { "match": "\\*", "name": "storage.modifier.pointer.cpp" }, { - "match": "(?:\\&((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))){2,}\\&", + "match": "(?:\\&((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))){2,}\\&", "captures": { "1": { "patterns": [ @@ -17017,16 +14048,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } }, "name": "invalid.illegal.reference-type.cpp" @@ -17037,17 +14059,17 @@ } ] }, - "32": { + "22": { "patterns": [ { "include": "#inline_comment" } ] }, - "33": { + "23": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -17056,32 +14078,23 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } ] }, - "34": { + "24": { "patterns": [ { "include": "#inline_comment" } ] }, - "35": { + "25": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -17090,32 +14103,23 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } ] }, - "36": { + "26": { "patterns": [ { "include": "#inline_comment" } ] }, - "37": { + "27": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -17124,42 +14128,33 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } ] }, - "38": { + "28": { "name": "punctuation.definition.begin.bracket.square.cpp" }, - "39": { + "29": { "patterns": [ { "include": "#evaluation_context" } ] }, - "40": { + "30": { "name": "punctuation.definition.end.bracket.square.cpp" }, - "41": { + "31": { "name": "punctuation.terminator.statement.cpp" } }, "name": "meta.declaration.type.alias.cpp" }, "type_casting_operators": { - "match": "((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -17180,16 +14175,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -17211,7 +14197,7 @@ "endCaptures": {}, "patterns": [ { - "begin": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(?={)|(?:((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\s*\\(\\s*\\(.*?\\)\\s*\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))?((?:(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*+)?(?:((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(:(?!:)))?)", + "begin": "((?|\\?\\?>)(?:(?:\\s)+)?(;)|(;))|(?=[;>\\[\\]=]))", "beginCaptures": { "0": { @@ -17234,16 +14220,7 @@ "name": "comment.block.cpp" }, "5": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "6": { "patterns": [ @@ -17269,21 +14246,12 @@ "name": "comment.block.cpp" }, "10": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "11": { "patterns": [ { - "match": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))", + "match": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))?(?=:|{|$)", + "match": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))?(?:(?:&|(?:\\*))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*(?:&|(?:\\*)))?((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))){2,}\\&", + "match": "(?:\\&((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))){2,}\\&", "captures": { "1": { "patterns": [ @@ -17533,16 +14456,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } }, "name": "invalid.illegal.reference-type.cpp" @@ -17567,16 +14481,7 @@ "name": "comment.block.cpp" }, "5": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "6": { "patterns": [ @@ -17592,16 +14497,7 @@ "name": "comment.block.cpp" }, "9": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "10": { "patterns": [ @@ -17617,16 +14513,7 @@ "name": "comment.block.cpp" }, "13": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "14": { "name": "entity.name.type.alias.cpp" @@ -17653,8 +14540,8 @@ "endCaptures": {}, "patterns": [ { - "begin": "(\\s*+((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\s*\\(\\s*\\(.*?\\)\\s*\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(?:(?:(?:unsigned)|(?:signed)|(?:short)|(?:long))|(?:(?:struct)|(?:class)|(?:union)|(?:enum)))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*((?:::)?(?:(?!\\b(?:__has_cpp_attribute|reinterpret_cast|atomic_noexcept|atomic_commit|atomic_cancel|__has_include|thread_local|dynamic_cast|synchronized|static_cast|const_cast|consteval|co_return|protected|constinit|constexpr|co_return|consteval|namespace|constexpr|constexpr|co_await|explicit|volatile|noexcept|co_yield|noexcept|noexcept|requires|typename|decltype|operator|template|continue|co_await|co_yield|volatile|register|restrict|reflexpr|mutable|alignof|include|private|defined|typedef|_Pragma|__asm__|concept|mutable|warning|default|virtual|alignas|public|sizeof|delete|not_eq|bitand|and_eq|xor_eq|typeid|switch|return|struct|static|extern|inline|friend|ifndef|define|pragma|export|import|module|catch|throw|const|or_eq|compl|while|ifdef|const|bitor|union|class|undef|error|break|using|endif|goto|line|enum|this|case|else|elif|else|not|try|for|asm|and|xor|new|do|if|or|if)\\b)(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<18>?)+>)(?:\\s)*+)?::)*+)?((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?!(?:(?:transaction_safe_dynamic)|(?:__has_cpp_attribute)|(?:reinterpret_cast)|(?:transaction_safe)|(?:atomic_noexcept)|(?:atomic_commit)|(?:__has_include)|(?:atomic_cancel)|(?:synchronized)|(?:thread_local)|(?:dynamic_cast)|(?:static_cast)|(?:const_cast)|(?:constexpr)|(?:co_return)|(?:constinit)|(?:namespace)|(?:protected)|(?:consteval)|(?:constexpr)|(?:constexpr)|(?:co_return)|(?:consteval)|(?:co_await)|(?:continue)|(?:template)|(?:reflexpr)|(?:volatile)|(?:register)|(?:co_await)|(?:co_yield)|(?:restrict)|(?:noexcept)|(?:volatile)|(?:override)|(?:explicit)|(?:decltype)|(?:operator)|(?:noexcept)|(?:noexcept)|(?:typename)|(?:requires)|(?:co_yield)|(?:nullptr)|(?:alignof)|(?:alignas)|(?:default)|(?:mutable)|(?:virtual)|(?:mutable)|(?:private)|(?:include)|(?:warning)|(?:_Pragma)|(?:defined)|(?:typedef)|(?:__asm__)|(?:concept)|(?:define)|(?:module)|(?:sizeof)|(?:switch)|(?:delete)|(?:pragma)|(?:and_eq)|(?:inline)|(?:xor_eq)|(?:typeid)|(?:import)|(?:extern)|(?:public)|(?:bitand)|(?:static)|(?:export)|(?:return)|(?:friend)|(?:ifndef)|(?:not_eq)|(?:false)|(?:final)|(?:break)|(?:const)|(?:catch)|(?:endif)|(?:ifdef)|(?:undef)|(?:error)|(?:audit)|(?:while)|(?:using)|(?:axiom)|(?:or_eq)|(?:compl)|(?:throw)|(?:bitor)|(?:const)|(?:line)|(?:case)|(?:else)|(?:this)|(?:true)|(?:goto)|(?:else)|(?:NULL)|(?:elif)|(?:new)|(?:asm)|(?:xor)|(?:and)|(?:try)|(?:not)|(?:for)|(?:do)|(?:if)|(?:or)|(?:if))\\b)(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\b((?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<18>?)+>)?(?![\\w<:.]))(((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))?(?:(?:&|(?:\\*))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*(?:&|(?:\\*)))?((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(\\()(\\*)(?:(?:\\s)+)?((?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)?)(?:(?:\\s)+)?(?:(\\[)(\\w*)(\\])(?:(?:\\s)+)?)*(\\))(?:(?:\\s)+)?(\\()", - "end": "(\\))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?=[{=,);>]|\\n)(?!\\()", + "begin": "(\\s*+((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\s*\\(\\s*\\(.*?\\)\\s*\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(?:(?:(?:(?:unsigned)|(?:signed)|(?:short)|(?:long))|(?:(?:struct)|(?:class)|(?:union)|(?:enum)))((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z))))*(?:((?:::)?(?:(?!\\b(?:__has_cpp_attribute|reinterpret_cast|atomic_noexcept|atomic_commit|atomic_cancel|__has_include|thread_local|dynamic_cast|synchronized|static_cast|const_cast|consteval|co_return|protected|constinit|constexpr|co_return|consteval|namespace|constexpr|constexpr|co_await|explicit|volatile|noexcept|co_yield|noexcept|noexcept|requires|typename|decltype|operator|template|continue|co_await|co_yield|volatile|register|restrict|reflexpr|mutable|alignof|include|private|defined|typedef|_Pragma|__asm__|concept|mutable|warning|default|virtual|alignas|public|sizeof|delete|not_eq|bitand|and_eq|xor_eq|typeid|switch|return|struct|static|extern|inline|friend|ifndef|define|pragma|export|import|module|catch|throw|const|or_eq|compl|while|ifdef|const|bitor|union|class|undef|error|break|using|endif|goto|line|enum|this|case|else|elif|else|not|try|for|asm|and|xor|new|do|if|or|if)\\b)(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<18>?)+>)(?:\\s)*+)?::)*+)((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z))))?(?!(?:(?:transaction_safe_dynamic)|(?:__has_cpp_attribute)|(?:reinterpret_cast)|(?:transaction_safe)|(?:atomic_noexcept)|(?:atomic_commit)|(?:__has_include)|(?:atomic_cancel)|(?:synchronized)|(?:thread_local)|(?:dynamic_cast)|(?:static_cast)|(?:const_cast)|(?:constexpr)|(?:co_return)|(?:constinit)|(?:namespace)|(?:protected)|(?:consteval)|(?:constexpr)|(?:constexpr)|(?:co_return)|(?:consteval)|(?:co_await)|(?:continue)|(?:template)|(?:reflexpr)|(?:volatile)|(?:register)|(?:co_await)|(?:co_yield)|(?:restrict)|(?:noexcept)|(?:volatile)|(?:override)|(?:explicit)|(?:decltype)|(?:operator)|(?:noexcept)|(?:noexcept)|(?:typename)|(?:requires)|(?:co_yield)|(?:nullptr)|(?:alignof)|(?:alignas)|(?:default)|(?:mutable)|(?:virtual)|(?:mutable)|(?:private)|(?:include)|(?:warning)|(?:_Pragma)|(?:defined)|(?:typedef)|(?:__asm__)|(?:concept)|(?:define)|(?:module)|(?:sizeof)|(?:switch)|(?:delete)|(?:pragma)|(?:and_eq)|(?:inline)|(?:xor_eq)|(?:typeid)|(?:import)|(?:extern)|(?:public)|(?:bitand)|(?:static)|(?:export)|(?:return)|(?:friend)|(?:ifndef)|(?:not_eq)|(?:false)|(?:final)|(?:break)|(?:const)|(?:catch)|(?:endif)|(?:ifdef)|(?:undef)|(?:error)|(?:audit)|(?:while)|(?:using)|(?:axiom)|(?:or_eq)|(?:compl)|(?:throw)|(?:bitor)|(?:const)|(?:line)|(?:case)|(?:else)|(?:this)|(?:true)|(?:goto)|(?:else)|(?:NULL)|(?:elif)|(?:new)|(?:asm)|(?:xor)|(?:and)|(?:try)|(?:not)|(?:for)|(?:do)|(?:if)|(?:or)|(?:if))\\b)(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\b((?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<18>?)+>)?(?![\\w<:.]))(((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))?(?:(?:&|(?:\\*))((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z))))*(?:&|(?:\\*)))?((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(\\()(\\*)(?:(?:\\s)+)?((?:(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*)?)(?:(?:\\s)+)?(?:(\\[)(\\w*)(\\])(?:(?:\\s)+)?)*(\\))(?:(?:\\s)+)?(\\()", + "end": "(\\))((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(?=[{=,);>]|\\n)(?!\\()", "beginCaptures": { "1": { "name": "meta.qualified_type.cpp", @@ -17735,16 +14622,7 @@ "name": "comment.block.cpp" }, "6": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "7": { "patterns": [ @@ -17760,16 +14638,7 @@ "name": "comment.block.cpp" }, "10": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "11": { "patterns": [ @@ -17808,16 +14677,7 @@ "name": "comment.block.cpp" }, "17": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "18": {}, "19": { @@ -17827,7 +14687,7 @@ "name": "storage.modifier.pointer.cpp" }, { - "match": "(?:\\&((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))){2,}\\&", + "match": "(?:\\&((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))){2,}\\&", "captures": { "1": { "patterns": [ @@ -17843,16 +14703,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } }, "name": "invalid.illegal.reference-type.cpp" @@ -17877,16 +14728,7 @@ "name": "comment.block.cpp" }, "23": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "24": { "patterns": [ @@ -17902,16 +14744,7 @@ "name": "comment.block.cpp" }, "27": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "28": { "patterns": [ @@ -17927,16 +14760,7 @@ "name": "comment.block.cpp" }, "31": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "32": { "name": "punctuation.section.parens.begin.bracket.round.function.pointer.cpp" @@ -17985,16 +14809,7 @@ "name": "comment.block.cpp" }, "5": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } }, "patterns": [ @@ -18016,7 +14831,7 @@ "endCaptures": {}, "patterns": [ { - "begin": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(?={)|(?:((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\s*\\(\\s*\\(.*?\\)\\s*\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))?((?:(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*+)?(?:((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(:(?!:)))?)", + "begin": "((?|\\?\\?>)(?:(?:\\s)+)?(;)|(;))|(?=[;>\\[\\]=]))", "beginCaptures": { "0": { @@ -18039,16 +14854,7 @@ "name": "comment.block.cpp" }, "5": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "6": { "patterns": [ @@ -18074,21 +14880,12 @@ "name": "comment.block.cpp" }, "10": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "11": { "patterns": [ { - "match": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))", + "match": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))?(?=:|{|$)", + "match": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))?(?:(?:&|(?:\\*))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*(?:&|(?:\\*)))?((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))){2,}\\&", + "match": "(?:\\&((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))){2,}\\&", "captures": { "1": { "patterns": [ @@ -18338,16 +15090,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } }, "name": "invalid.illegal.reference-type.cpp" @@ -18372,16 +15115,7 @@ "name": "comment.block.cpp" }, "5": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "6": { "patterns": [ @@ -18397,16 +15131,7 @@ "name": "comment.block.cpp" }, "9": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "10": { "patterns": [ @@ -18422,16 +15147,7 @@ "name": "comment.block.cpp" }, "13": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "14": { "name": "entity.name.type.alias.cpp" @@ -18458,7 +15174,7 @@ "endCaptures": {}, "patterns": [ { - "begin": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(?={)|(?:((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\s*\\(\\s*\\(.*?\\)\\s*\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))?((?:(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*+)?(?:((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(:(?!:)))?)", + "begin": "((?|\\?\\?>)(?:(?:\\s)+)?(;)|(;))|(?=[;>\\[\\]=]))", "beginCaptures": { "0": { @@ -18481,16 +15197,7 @@ "name": "comment.block.cpp" }, "5": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "6": { "patterns": [ @@ -18516,21 +15223,12 @@ "name": "comment.block.cpp" }, "10": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "11": { "patterns": [ { - "match": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))", + "match": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))?(?=:|{|$)", + "match": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))?(?:(?:&|(?:\\*))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*(?:&|(?:\\*)))?((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))){2,}\\&", + "match": "(?:\\&((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))){2,}\\&", "captures": { "1": { "patterns": [ @@ -18780,16 +15433,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } }, "name": "invalid.illegal.reference-type.cpp" @@ -18814,16 +15458,7 @@ "name": "comment.block.cpp" }, "5": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "6": { "patterns": [ @@ -18839,16 +15474,7 @@ "name": "comment.block.cpp" }, "9": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "10": { "patterns": [ @@ -18864,16 +15490,7 @@ "name": "comment.block.cpp" }, "13": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "14": { "name": "entity.name.type.alias.cpp" @@ -18890,7 +15507,7 @@ ] }, "typeid_operator": { - "begin": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(\\()", + "begin": "((?(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(\\s*+((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\s*\\(\\s*\\(.*?\\)\\s*\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))?((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(?:(?:(?:unsigned)|(?:signed)|(?:short)|(?:long))|(?:(?:struct)|(?:class)|(?:union)|(?:enum)))((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*((?:::)?(?:(?!\\b(?:__has_cpp_attribute|reinterpret_cast|atomic_noexcept|atomic_commit|atomic_cancel|__has_include|thread_local|dynamic_cast|synchronized|static_cast|const_cast|consteval|co_return|protected|constinit|constexpr|co_return|consteval|namespace|constexpr|constexpr|co_await|explicit|volatile|noexcept|co_yield|noexcept|noexcept|requires|typename|decltype|operator|template|continue|co_await|co_yield|volatile|register|restrict|reflexpr|mutable|alignof|include|private|defined|typedef|_Pragma|__asm__|concept|mutable|warning|default|virtual|alignas|public|sizeof|delete|not_eq|bitand|and_eq|xor_eq|typeid|switch|return|struct|static|extern|inline|friend|ifndef|define|pragma|export|import|module|catch|throw|const|or_eq|compl|while|ifdef|const|bitor|union|class|undef|error|break|using|endif|goto|line|enum|this|case|else|elif|else|not|try|for|asm|and|xor|new|do|if|or|if)\\b)(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<17>?)+>)(?:\\s)*+)?::)*+)?((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?!(?:(?:transaction_safe_dynamic)|(?:__has_cpp_attribute)|(?:reinterpret_cast)|(?:transaction_safe)|(?:atomic_noexcept)|(?:atomic_commit)|(?:__has_include)|(?:atomic_cancel)|(?:synchronized)|(?:thread_local)|(?:dynamic_cast)|(?:static_cast)|(?:const_cast)|(?:constexpr)|(?:co_return)|(?:constinit)|(?:namespace)|(?:protected)|(?:consteval)|(?:constexpr)|(?:constexpr)|(?:co_return)|(?:consteval)|(?:co_await)|(?:continue)|(?:template)|(?:reflexpr)|(?:volatile)|(?:register)|(?:co_await)|(?:co_yield)|(?:restrict)|(?:noexcept)|(?:volatile)|(?:override)|(?:explicit)|(?:decltype)|(?:operator)|(?:noexcept)|(?:noexcept)|(?:typename)|(?:requires)|(?:co_yield)|(?:nullptr)|(?:alignof)|(?:alignas)|(?:default)|(?:mutable)|(?:virtual)|(?:mutable)|(?:private)|(?:include)|(?:warning)|(?:_Pragma)|(?:defined)|(?:typedef)|(?:__asm__)|(?:concept)|(?:define)|(?:module)|(?:sizeof)|(?:switch)|(?:delete)|(?:pragma)|(?:and_eq)|(?:inline)|(?:xor_eq)|(?:typeid)|(?:import)|(?:extern)|(?:public)|(?:bitand)|(?:static)|(?:export)|(?:return)|(?:friend)|(?:ifndef)|(?:not_eq)|(?:false)|(?:final)|(?:break)|(?:const)|(?:catch)|(?:endif)|(?:ifdef)|(?:undef)|(?:error)|(?:audit)|(?:while)|(?:using)|(?:axiom)|(?:or_eq)|(?:compl)|(?:throw)|(?:bitor)|(?:const)|(?:line)|(?:case)|(?:else)|(?:this)|(?:true)|(?:goto)|(?:else)|(?:NULL)|(?:elif)|(?:new)|(?:asm)|(?:xor)|(?:and)|(?:try)|(?:not)|(?:for)|(?:do)|(?:if)|(?:or)|(?:if))\\b)(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\b((?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<17>?)+>)?(?![\\w<:.]))", + "match": "(((?:((?:\\s*+\\/\\*(?:[^\\*]++|\\*+(?!\\/))*+\\*\\/\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))(?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<17>?)+>)(?:\\s)*+)?::)*+)((?:((?:\\s*+\\/\\*(?:[^\\*]++|\\*+(?!\\/))*+\\*\\/\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z))))?(?!(?:(?:transaction_safe_dynamic)|(?:__has_cpp_attribute)|(?:reinterpret_cast)|(?:transaction_safe)|(?:atomic_noexcept)|(?:atomic_commit)|(?:__has_include)|(?:atomic_cancel)|(?:synchronized)|(?:thread_local)|(?:dynamic_cast)|(?:static_cast)|(?:const_cast)|(?:constexpr)|(?:co_return)|(?:constinit)|(?:namespace)|(?:protected)|(?:consteval)|(?:constexpr)|(?:constexpr)|(?:co_return)|(?:consteval)|(?:co_await)|(?:continue)|(?:template)|(?:reflexpr)|(?:volatile)|(?:register)|(?:co_await)|(?:co_yield)|(?:restrict)|(?:noexcept)|(?:volatile)|(?:override)|(?:explicit)|(?:decltype)|(?:operator)|(?:noexcept)|(?:noexcept)|(?:typename)|(?:requires)|(?:co_yield)|(?:nullptr)|(?:alignof)|(?:alignas)|(?:default)|(?:mutable)|(?:virtual)|(?:mutable)|(?:private)|(?:include)|(?:warning)|(?:_Pragma)|(?:defined)|(?:typedef)|(?:__asm__)|(?:concept)|(?:define)|(?:module)|(?:sizeof)|(?:switch)|(?:delete)|(?:pragma)|(?:and_eq)|(?:inline)|(?:xor_eq)|(?:typeid)|(?:import)|(?:extern)|(?:public)|(?:bitand)|(?:static)|(?:export)|(?:return)|(?:friend)|(?:ifndef)|(?:not_eq)|(?:false)|(?:final)|(?:break)|(?:const)|(?:catch)|(?:endif)|(?:ifdef)|(?:undef)|(?:error)|(?:audit)|(?:while)|(?:using)|(?:axiom)|(?:or_eq)|(?:compl)|(?:throw)|(?:bitor)|(?:const)|(?:line)|(?:case)|(?:else)|(?:this)|(?:true)|(?:goto)|(?:else)|(?:NULL)|(?:elif)|(?:new)|(?:asm)|(?:xor)|(?:and)|(?:try)|(?:not)|(?:for)|(?:do)|(?:if)|(?:or)|(?:if))\\b)(?:[a-zA-Z_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))(?:[a-zA-Z0-9_]|(?:\\\\u[0-9a-fA-F]{4}|\\\\U[0-9a-fA-F]{8}))*\\b((?]*+|\"(?:[^\"]*|\\\\\")\")|'(?:[^']*|\\\\')')\\g<17>?)+>)?(?![\\w<:.]))", "captures": { "1": { "name": "storage.modifier.cpp" @@ -18953,7 +15561,7 @@ "3": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -18962,16 +15570,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -18987,7 +15586,7 @@ "5": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -18996,16 +15595,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -19086,7 +15676,7 @@ "9": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -19095,16 +15685,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -19120,7 +15701,7 @@ "11": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -19129,16 +15710,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -19177,7 +15749,7 @@ "16": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -19186,16 +15758,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -19205,7 +15768,7 @@ } }, "undef": { - "match": "(^((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(#)(?:(?:\\s)+)?undef\\b)((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -19229,16 +15792,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -19257,7 +15811,7 @@ "6": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -19266,16 +15820,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -19288,7 +15833,7 @@ "name": "meta.preprocessor.undef.cpp" }, "union_block": { - "begin": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:(?={)|(?:((?:(?:(?:\\[\\[.*?\\]\\]|__attribute(?:__)?\\s*\\(\\s*\\(.*?\\)\\s*\\))|__declspec\\(.*?\\))|alignas\\(.*?\\))(?!\\)))((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))?((?:(?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*+)?(?:((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(:(?!:)))?)", + "begin": "((?|\\?\\?>)(?:(?:\\s)+)?(;)|(;))|(?=[;>\\[\\]=]))", "beginCaptures": { "0": { @@ -19311,16 +15856,7 @@ "name": "comment.block.cpp" }, "5": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "6": { "patterns": [ @@ -19346,21 +15882,12 @@ "name": "comment.block.cpp" }, "10": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" }, "11": { "patterns": [ { - "match": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))", + "match": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?:((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))?(?=:|{|$)", + "match": "((?(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))((?(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))?(?:(?:&|(?:\\*))((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z))))*(?:&|(?:\\*)))?((?:((?:(?>(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))\\b(?!override\\W|override\\$|final\\W|final\\$)((?(?:\\s)+)|\\/\\*(?:[^\\*]|(?:\\*)++[^\\/])*+(?:\\*)++\\/)+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))(?=\\S)(?![:{a-zA-Z])", + "match": "((?(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -19616,16 +16098,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -19641,7 +16114,7 @@ "name": "storage.modifier.pointer.cpp" }, { - "match": "(?:\\&((?:(?:(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))+)|(?:\\b)|(?=\\W)|(?<=\\W)|(?:\\A)|(?:\\Z)))){2,}\\&", + "match": "(?:\\&((?:(?:(?:\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+)+)|(?:\\s++)|(?<=\\W)|(?=\\W)|^|(?:\\n?$)|(?:\\A)|(?:\\Z)))){2,}\\&", "captures": { "1": { "patterns": [ @@ -19657,16 +16130,7 @@ "name": "comment.block.cpp" }, "4": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } }, "name": "invalid.illegal.reference-type.cpp" @@ -19687,7 +16151,7 @@ "7": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -19696,16 +16160,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -19721,7 +16176,7 @@ "9": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -19730,16 +16185,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -19755,7 +16201,7 @@ "11": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -19764,16 +16210,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } @@ -19792,7 +16229,7 @@ "14": { "patterns": [ { - "match": "(?:(?>(?:\\s)+)|(\\/\\*)((?:[^\\*]|(?:\\*)++[^\\/])*+((?:\\*)++\\/)))", + "match": "\\s*+(\\/\\*)((?:[^\\*]++|\\*+(?!\\/))*+(\\*\\/))\\s*+", "captures": { "1": { "name": "comment.block.cpp punctuation.definition.comment.begin.cpp" @@ -19801,16 +16238,7 @@ "name": "comment.block.cpp" }, "3": { - "patterns": [ - { - "match": "\\*\\/", - "name": "comment.block.cpp punctuation.definition.comment.end.cpp" - }, - { - "match": "\\*", - "name": "comment.block.cpp" - } - ] + "name": "comment.block.cpp punctuation.definition.comment.end.cpp" } } } diff --git a/extensions/razor/cgmanifest.json b/extensions/razor/cgmanifest.json index 77736bd5dba..d74caebd37c 100644 --- a/extensions/razor/cgmanifest.json +++ b/extensions/razor/cgmanifest.json @@ -6,7 +6,7 @@ "git": { "name": "dotnet/razor-tooling", "repositoryUrl": "https://github.com/dotnet/razor-tooling", - "commitHash": "558b502fbef5ecdf386ccd6d47b0b40b5f8800a7" + "commitHash": "4d5eeeaeeadf6371354e5fd8ad4c195185806f0c" } }, "license": "MIT", diff --git a/extensions/razor/syntaxes/cshtml.tmLanguage.json b/extensions/razor/syntaxes/cshtml.tmLanguage.json index eea9de72dcc..3adbebf821b 100644 --- a/extensions/razor/syntaxes/cshtml.tmLanguage.json +++ b/extensions/razor/syntaxes/cshtml.tmLanguage.json @@ -4,7 +4,7 @@ "If you want to provide a fix or improvement, please create a pull request against the original repository.", "Once accepted there, we are happy to receive an update request." ], - "version": "https://github.com/dotnet/razor-tooling/commit/558b502fbef5ecdf386ccd6d47b0b40b5f8800a7", + "version": "https://github.com/dotnet/razor-tooling/commit/4d5eeeaeeadf6371354e5fd8ad4c195185806f0c", "name": "ASP.NET Razor", "scopeName": "text.html.cshtml", "patterns": [ @@ -558,7 +558,7 @@ "contentName": "source.cs", "patterns": [ { - "include": "source.cs" + "include": "source.cs#class-or-struct-members" } ], "end": "(\\})", diff --git a/extensions/sql/cgmanifest.json b/extensions/sql/cgmanifest.json index b40cb39a6e3..7f2438ad0d9 100644 --- a/extensions/sql/cgmanifest.json +++ b/extensions/sql/cgmanifest.json @@ -6,11 +6,11 @@ "git": { "name": "microsoft/vscode-mssql", "repositoryUrl": "https://github.com/microsoft/vscode-mssql", - "commitHash": "b8b58864526c048002b7c3964bdac8aac3713bd9" + "commitHash": "c005d9d720049d86938467992bd8189a6aa32a6d" } }, "license": "MIT", - "version": "1.16.0" + "version": "1.17.0" } ], "version": 1 diff --git a/extensions/sql/syntaxes/sql.tmLanguage.json b/extensions/sql/syntaxes/sql.tmLanguage.json index 26575ff4549..3557fb42c09 100644 --- a/extensions/sql/syntaxes/sql.tmLanguage.json +++ b/extensions/sql/syntaxes/sql.tmLanguage.json @@ -4,7 +4,7 @@ "If you want to provide a fix or improvement, please create a pull request against the original repository.", "Once accepted there, we are happy to receive an update request." ], - "version": "https://github.com/microsoft/vscode-mssql/commit/b8b58864526c048002b7c3964bdac8aac3713bd9", + "version": "https://github.com/microsoft/vscode-mssql/commit/c005d9d720049d86938467992bd8189a6aa32a6d", "name": "SQL", "scopeName": "source.sql", "patterns": [ @@ -16,10 +16,6 @@ "match": "(\\[)[^\\]]*(\\])", "name": "text.bracketed" }, - { - "match": "\\b(?i)(abort|abort_after_wait|absent|absolute|accent_sensitivity|acceptable_cursopt|acp|action|activation|add|address|admin|aes_128|aes_192|aes_256|affinity|after|aggregate|algorithm|all_constraints|all_errormsgs|all_indexes|all_levels|all_results|allow_connections|allow_dup_row|allow_encrypted_value_modifications|allow_page_locks|allow_row_locks|allow_snapshot_isolation|alter|altercolumn|always|anonymous|ansi_defaults|ansi_null_default|ansi_null_dflt_off|ansi_null_dflt_on|ansi_nulls|ansi_padding|ansi_warnings|appdomain|append|application|apply|arithabort|arithignore|assembly|asymmetric|asynchronous_commit|at|atan2|atomic|attach|attach_force_rebuild_log|attach_rebuild_log|audit|auth_realm|authentication|auto|auto_cleanup|auto_close|auto_create_statistics|auto_shrink|auto_update_statistics|auto_update_statistics_async|automated_backup_preference|automatic|autopilot|availability|availability_mode|backup_priority|base64|basic|batches|batchsize|before|between|bigint|binary|binding|bit|block|blocksize|bmk|break|broker|broker_instance|bucket_count|buffer|buffercount|bulk_logged|by|call|caller|card|case|catalog|catch|cert|certificate|change_retention|change_tracking|change_tracking_context|changes|char|character|character_set|check_expiration|check_policy|checkconstraints|checkindex|checkpoint|cleanup_policy|clear|clear_port|close|clustered|codepage|collection|column_encryption_key|column_master_key|columnstore|columnstore_archive|colv_80_to_100|colv_100_to_80|commit_differential_base|committed|compatibility_level|compress_all_row_groups|compression|compression_delay|concat_null_yields_null|concatenate|configuration|connect|continue|continue_after_error|contract|contract_name|control|conversation|conversation_group_id|conversation_handle|copy|copy_only|count_rows|counter|create(\\s+or\\s+alter)?|credential|cross|cryptographic|cryptographic_provider|cube|cursor|cursor_close_on_commit|cursor_default|data|data_compression|data_flush_interval_seconds|data_mirroring|data_purity|data_source|database|database_name|database_snapshot|datafiletype|date_correlation_optimization|date|datefirst|dateformat|date_format|datetime|datetime2|datetimeoffset|days|db_chaining|dbid|dbidexec|dbo_only|deadlock_priority|deallocate|dec|decimal|declare|decrypt|decrypt_a|decryption|default_database|default_language|default_logon_domain|default_schema|definition|delay|delayed_durability|delimitedtext|density_vector|dependent|des|description|desired_state|desx|differential|digest|disable|disable_broker|disable_def_cnst_chk|disabled|disk|distinct|distributed|distribution|drop|drop_existing|dts_buffers|dump|durability|dynamic|edition|elements|else|emergency|empty|enable|enable_broker|enabled|encoding|encrypted|encrypted_value|encryption|encryption_type|end|endpoint|endpoint_url|enhancedintegrity|entry|error_broker_conversations|errorfile|estimateonly|event|except|exec|executable|execute|exists|expand|expiredate|expiry_date|explicit|external|external_access|failover|failover_mode|failure_condition_level|fast|fast_forward|fastfirstrow|federated_service_account|fetch|field_terminator|fieldterminator|file|filelistonly|filegroup|filename|filestream|filestream_log|filestream_on|filetable|file_format|filter|first_row|fips_flagger|fire_triggers|first|firstrow|float|flush_interval_seconds|fmtonly|following|force|force_failover_allow_data_loss|force_service_allow_data_loss|forced|forceplan|formatfile|format_options|format_type|formsof|forward_only|free_cursors|free_exec_context|fullscan|fulltext|fulltextall|fulltextkey|function|generated|get|geography|geometry|global|go|goto|governor|guid|hadoop|hardening|hash|hashed|header_limit|headeronly|health_check_timeout|hidden|hierarchyid|histogram|histogram_steps|hits_cursors|hits_exec_context|hours|http|identity|identity_value|if|ifnull|ignore_constraints|ignore_dup_key|ignore_dup_row|ignore_triggers|image|immediate|implicit_transactions|include|include_null_values|index|inflectional|init|initiator|insensitive|insert|instead|int|integer|integrated|intersect|intermediate|interval_length_minutes|into|inuse_cursors|inuse_exec_context|io|is|isabout|iso_week|isolation|job_tracker_location|json|keep|keep_nulls|keep_replication|keepdefaults|keepfixed|keepidentity|keepnulls|kerberos|key|key_path|key_source|key_store_provider_name|keyset|kill|kilobytes_per_batch|labelonly|langid|language|last|lastrow|legacy_cardinality_estimation|length|level|lifetime|lineage_80_to_100|lineage_100_to_80|listener_ip|listener_port|load|loadhistory|lob_compaction|local|local_service_name|locate|location|lock_escalation|lock_timeout|lockres|login|login_type|loop|manual|mark_in_use_for_removal|masked|master|matched|max_queue_readers|max_duration|max_outstanding_io_per_volume|maxdop|maxerrors|maxlength|maxtransfersize|max_plans_per_query|max_storage_size_mb|mediadescription|medianame|mediapassword|memogroup|memory_optimized|merge|message|message_forward_size|message_forwarding|microsecond|millisecond|minutes|mirror_address|misses_cursors|misses_exec_context|mixed|modify|money|move|multi_user|must_change|name|namespace|nanosecond|native|native_compilation|nchar|ncharacter|never|new_account|new_broker|newname|next|no|no_browsetable|no_checksum|no_compression|no_infomsgs|no_triggers|no_truncate|nocount|noexec|noexpand|noformat|noinit|nolock|nonatomic|nonclustered|nondurable|none|norecompute|norecovery|noreset|norewind|noskip|not|notification|nounload|now|nowait|ntext|ntlm|numeric|numeric_roundabort|nvarchar|object|objid|oem|offline|old_account|online|operation_mode|open|openjson|optimistic|option|orc|out|outer|output|over|override|owner|ownership|pad_index|page|page_checksum|page_verify|pagecount|paglock|param|parameter_sniffing|parameter_type_expansion|parameterization|parquet|parseonly|partial|partition|partner|password|path|pause|percentage|permission_set|persisted|period|physical_only|plan_forcing_mode|policy|pool|population|ports|preceding|precision|predicate|presume_abort|primary|primary_role|print|prior|priority |priority_level|private|proc(edure)?|procedure_name|profile|provider|query_capture_mode|query_governor_cost_limit|query_optimizer_hotfixes|query_store|queue|quoted_identifier|raiserror|range|raw|rcfile|rc2|rc4|rc4_128|rdbms|read_committed_snapshot|read|read_only|read_write|readcommitted|readcommittedlock|readonly|readpast|readuncommitted|readwrite|real|rebuild|receive|recmodel_70backcomp|recompile|reconfigure|recovery|recursive|recursive_triggers|redo_queue|reject_sample_value|reject_type|reject_value|relative|remote|remote_data_archive|remote_proc_transactions|remote_service_name|remove|removed_cursors|removed_exec_context|reorganize|repeat|repeatable|repeatableread|replica|replicated|replnick_100_to_80|replnickarray_80_to_100|replnickarray_100_to_80|required|required_cursopt|resample|reset|resource|resource_manager_location|restart|restore|restricted_user|resume|retaindays|retention|return|revert|rewind|rewindonly|returns|robust|role|rollup|root|round_robin|route|row|rowdump|rowguidcol|rowlock|row_terminator|rows|rows_per_batch|rowsets_only|rowterminator|rowversion|rsa_1024|rsa_2048|rsa_3072|rsa_4096|rsa_512|safe|safety|sample|save|schema|schemabinding|scoped|scroll|scroll_locks|sddl|secexpr|secondary|secondary_only|secondary_role|secret|security|securityaudit|selective|self|send|sent|sequence|serde_method|serializable|server|service|service_broker|service_name|service_objective|session_timeout|session|sessions|seterror|setopts|sets|shard_map_manager|shard_map_name|sharded|shared_memory|show_statistics|showplan_all|showplan_text|showplan_xml|showplan_xml_with_recompile|shrinkdb|shutdown|sid|signature|simple|single_blob|single_clob|single_nclob|single_user|singleton|site|size_based_cleanup_mode|skip|smalldatetime|smallint|smallmoney|snapshot|snapshot_import|snapshotrestorephase|soap|softnuma|sort_in_tempdb|sorted_data|sorted_data_reorg|spatial|sql|sql_bigint|sql_binary|sql_bit|sql_char|sql_date|sql_decimal|sql_double|sql_float|sql_guid|sql_handle|sql_longvarbinary|sql_longvarchar|sql_numeric|sql_real|sql_smallint|sql_time|sql_timestamp|sql_tinyint|sql_tsi_day|sql_tsi_frac_second|sql_tsi_hour|sql_tsi_minute|sql_tsi_month|sql_tsi_quarter|sql_tsi_second|sql_tsi_week|sql_tsi_year|sql_type_date|sql_type_time|sql_type_timestamp|sql_varbinary|sql_varchar|sql_variant|sql_wchar|sql_wlongvarchar|ssl|ssl_port|standard|standby|start|start_date|started|stat_header|state|statement|static|statistics|statistics_incremental|statistics_norecompute|statistics_only|statman|stats_stream|status|stop|stop_on_error|stopat|stopatmark|stopbeforemark|stoplist|stopped|string_delimiter|subject|supplemental_logging|supported|suspend|symmetric|synchronous_commit|synonym|sysname|system|system_time|system_versioning|table|tableresults|tablock|tablockx|take|tape|target|target_index|target_partition|tcp|temporal_history_retention|text|textimage_on|then|thesaurus|throw|time|timeout|timestamp|tinyint|to|top|torn_page_detection|track_columns_updated|tran|transaction|transfer|triple_des|triple_des_3key|truncate|trustworthy|try|tsql|type|type_desc|type_warning|tzoffset|uid|unbounded|uncommitted|unique|uniqueidentifier|unlimited|unload|unlock|unsafe|updlock|url|use|useplan|useroptions|use_type_default|using|utcdatetime|valid_xml|validation|value|values|varbinary|varchar|verbose|verifyonly|version|view_metadata|virtual_device|visiblity|waitfor|webmethod|weekday|weight|well_formed_xml|when|while|widechar|widechar_ansi|widenative|window|windows|with|within|witness|without|without_array_wrapper|workload|wsdl|xact_abort|xlock|xml|xmlschema|xquery|xsinil|zone)\\b", - "name": "keyword.other.sql" - }, { "include": "#comments" }, @@ -191,84 +187,172 @@ "name": "keyword.operator.concatenator.sql" }, { - "match": "(?i)\\b(aggregate|approx_count_distinct|avg|checksum_agg|count|count_big|grouping|grouping_id|max|min|sum|stdev|stdevp|var|varp)\\b", - "name": "support.function.aggregate.sql" + "match": "(?i)\\b(approx_count_distinct|approx_percentile_cont|approx_percentile_disc|avg|checksum_agg|count|count_big|group|grouping|grouping_id|max|min|sum|stdev|stdevp|var|varp)\\b\\s*\\(", + "captures": { + "1": { + "name": "support.function.aggregate.sql" + } + } }, { - "match": "(?i)\\b(cume_dist|first_value|lag|last_value|lead|percent_rank|percentile_cont|percentile_disc)\\b", - "name": "support.function.analytic.sql" + "match": "(?i)\\b(cume_dist|first_value|lag|last_value|lead|percent_rank|percentile_cont|percentile_disc)\\b\\s*\\(", + "captures": { + "1": { + "name": "support.function.analytic.sql" + } + } }, { - "match": "(?i)\\b(cast|convert|parse|try_cast|try_convert|try_parse)\\b", - "name": "support.function.conversion.sql" + "match": "(?i)\\b(bit_count|get_bit|left_shift|right_shift|set_bit)\\b\\s*\\(", + "captures": { + "1": { + "name": "support.function.bitmanipulation.sql" + } + } }, { - "match": "(?i)\\b(collationproperty|tertiary_weights)\\b", - "name": "support.function.collation.sql" + "match": "(?i)\\b(cast|convert|parse|try_cast|try_convert|try_parse)\\b\\s*\\(", + "captures": { + "1": { + "name": "support.function.conversion.sql" + } + } }, { - "match": "(?i)\\b(asymkey_id|asymkeyproperty|certproperty|cert_id|crypt_gen_random|decryptbyasymkey|decryptbycert|decryptbykey|decryptbykeyautoasymkey|decryptbykeyautocert|decryptbypassphrase|encryptbyasymkey|encryptbycert|encryptbykey|encryptbypassphrase|hashbytes|is_objectsigned|key_guid|key_id|key_name|signbyasymkey|signbycert|symkeyproperty|verifysignedbycert|verifysignedbyasymkey)\\b", - "name": "support.function.cryptographic.sql" + "match": "(?i)\\b(collationproperty|tertiary_weights)\\b\\s*\\(", + "captures": { + "1": { + "name": "support.function.collation.sql" + } + } }, { - "match": "(?i)\\b(cursor_status)\\b", - "name": "support.function.cursor.sql" + "match": "(?i)\\b(asymkey_id|asymkeyproperty|certproperty|cert_id|crypt_gen_random|decryptbyasymkey|decryptbycert|decryptbykey|decryptbykeyautoasymkey|decryptbykeyautocert|decryptbypassphrase|encryptbyasymkey|encryptbycert|encryptbykey|encryptbypassphrase|hashbytes|is_objectsigned|key_guid|key_id|key_name|signbyasymkey|signbycert|symkeyproperty|verifysignedbycert|verifysignedbyasymkey)\\b\\s*\\(", + "captures": { + "1": { + "name": "support.function.cryptographic.sql" + } + } }, { - "match": "(?i)\\b(sysdatetime|sysdatetimeoffset|sysutcdatetime|current_time(stamp)?|getdate|getutcdate|datename|datepart|day|month|year|datefromparts|datetime2fromparts|datetimefromparts|datetimeoffsetfromparts|smalldatetimefromparts|timefromparts|datediff|dateadd|eomonth|switchoffset|todatetimeoffset|isdate|date_bucket)\\b", - "name": "support.function.datetime.sql" + "match": "(?i)\\b(cursor_status)\\b\\s*\\(", + "captures": { + "1": { + "name": "support.function.cursor.sql" + } + } }, { - "match": "(?i)\\b(datalength|ident_current|ident_incr|ident_seed|identity|sql_variant_property)\\b", - "name": "support.function.datatype.sql" + "match": "(?i)\\b(sysdatetime|sysdatetimeoffset|sysutcdatetime|current_time(stamp)?|getdate|getutcdate|datename|datepart|day|month|year|datefromparts|datetime2fromparts|datetimefromparts|datetimeoffsetfromparts|smalldatetimefromparts|timefromparts|datediff|dateadd|datetrunc|eomonth|switchoffset|todatetimeoffset|isdate|date_bucket)\\b\\s*\\(", + "captures": { + "1": { + "name": "support.function.datetime.sql" + } + } }, { - "match": "(?i)\\b(coalesce|nullif)\\b", - "name": "support.function.expression.sql" + "match": "(?i)\\b(datalength|ident_current|ident_incr|ident_seed|identity|sql_variant_property)\\b\\s*\\(", + "captures": { + "1": { + "name": "support.function.datatype.sql" + } + } }, { - "match": "(? Date: Tue, 1 Nov 2022 07:28:06 -0700 Subject: [PATCH 008/185] fix Alpine builds with npm custom registry (#165137) fixes #165135 --- .../linux/product-build-alpine.yml | 31 ++++++++++--------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/build/azure-pipelines/linux/product-build-alpine.yml b/build/azure-pipelines/linux/product-build-alpine.yml index 2175c76556e..887d69ed121 100644 --- a/build/azure-pipelines/linux/product-build-alpine.yml +++ b/build/azure-pipelines/linux/product-build-alpine.yml @@ -59,6 +59,23 @@ steps: condition: and(succeeded(), ne(variables['NPM_REGISTRY'], 'none')) displayName: Setup NPM Registry + # In Alpine, we always want to setup and authenticate against the NPM_REGISTRY + # because of the Prebuild step, since it always runs `yarn` from inside an alpine + # container + - script: | + set -e + npm config set registry "$NPM_REGISTRY" --location=project + npm config set always-auth=true --location=project + yarn config set registry "$NPM_REGISTRY" + condition: and(succeeded(), ne(variables['NPM_REGISTRY'], 'none')) + displayName: Setup NPM & Yarn + + - task: npmAuthenticate@0 + inputs: + workingFile: .npmrc + condition: and(succeeded(), ne(variables['NPM_REGISTRY'], 'none')) + displayName: Setup NPM Authentication + - script: | mkdir -p .build node build/azure-pipelines/common/computeNodeModulesCacheKey.js "alpine" > .build/yarnlockhash @@ -84,20 +101,6 @@ steps: condition: and(succeeded(), eq(variables.NODE_MODULES_RESTORED, 'true')) displayName: Extract node_modules cache - - script: | - set -e - npm config set registry "$NPM_REGISTRY" --location=project - npm config set always-auth=true --location=project - yarn config set registry "$NPM_REGISTRY" - condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'), ne(variables['NPM_REGISTRY'], 'none')) - displayName: Setup NPM & Yarn - - - task: npmAuthenticate@0 - inputs: - workingFile: .npmrc - condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'), ne(variables['NPM_REGISTRY'], 'none')) - displayName: Setup NPM Authentication - - script: | set -e for i in {1..3}; do # try 3 times From fe882ab334061c37448a921afa627e52dbf2d556 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Tue, 1 Nov 2022 15:41:19 +0100 Subject: [PATCH 009/185] api feedback (#164470) * api feedback - remove critical log level - move log level off to be 0 * handle off log level * fix disabling log level in tests Co-authored-by: Raymond Zhao <7199958+rzhao271@users.noreply.github.com> --- extensions/vscode-api-tests/src/utils.ts | 2 +- src/vs/platform/log/browser/log.ts | 1 - src/vs/platform/log/common/bufferLog.ts | 5 -- src/vs/platform/log/common/fileLog.ts | 7 -- src/vs/platform/log/common/log.ts | 70 ++++--------------- src/vs/platform/log/node/spdlogLog.ts | 29 +++++++- .../test/common/telemetryLogAppender.test.ts | 6 -- .../userDataSync/common/userDataSyncLog.ts | 4 -- src/vs/server/node/serverServices.ts | 10 --- .../api/browser/mainThreadLogService.ts | 11 +-- src/vs/workbench/api/node/proxyResolver.ts | 2 +- .../contrib/bulkEdit/browser/bulkFileEdits.ts | 2 +- .../common/editSessionsLogService.ts | 4 -- .../contrib/logs/common/logsActions.ts | 1 - .../notebookEditorModelResolverServiceImpl.ts | 2 +- .../common/abstractExtensionService.ts | 8 +-- .../extensions/common/extensionHostManager.ts | 6 +- .../vscode.proposed.extensionLog.d.ts | 13 ++-- 18 files changed, 64 insertions(+), 119 deletions(-) diff --git a/extensions/vscode-api-tests/src/utils.ts b/extensions/vscode-api-tests/src/utils.ts index 7c506694289..301aec20b7e 100644 --- a/extensions/vscode-api-tests/src/utils.ts +++ b/extensions/vscode-api-tests/src/utils.ts @@ -69,7 +69,7 @@ export function delay(ms: number) { export function withLogDisabled(runnable: () => Promise): () => Promise { return async (): Promise => { const logLevel = await vscode.commands.executeCommand('_extensionTests.getLogLevel'); - await vscode.commands.executeCommand('_extensionTests.setLogLevel', 6 /* critical */); + await vscode.commands.executeCommand('_extensionTests.setLogLevel', 'off'); try { await runnable(); diff --git a/src/vs/platform/log/browser/log.ts b/src/vs/platform/log/browser/log.ts index 063052cae71..a5413ac50ee 100644 --- a/src/vs/platform/log/browser/log.ts +++ b/src/vs/platform/log/browser/log.ts @@ -17,7 +17,6 @@ function logLevelToString(level: LogLevel): string { case LogLevel.Info: return 'info'; case LogLevel.Warning: return 'warn'; case LogLevel.Error: return 'error'; - case LogLevel.Critical: return 'error'; } return 'info'; } diff --git a/src/vs/platform/log/common/bufferLog.ts b/src/vs/platform/log/common/bufferLog.ts index 76b3bfdc6c1..b6dba340928 100644 --- a/src/vs/platform/log/common/bufferLog.ts +++ b/src/vs/platform/log/common/bufferLog.ts @@ -17,7 +17,6 @@ function getLogFunction(logger: ILogger, level: LogLevel): Function { case LogLevel.Info: return logger.info; case LogLevel.Warning: return logger.warn; case LogLevel.Error: return logger.error; - case LogLevel.Critical: return logger.critical; default: throw new Error('Invalid log level'); } } @@ -76,10 +75,6 @@ export class BufferLogService extends AbstractLogger implements ILogService { this._log(LogLevel.Error, message, ...args); } - critical(message: string | Error, ...args: any[]): void { - this._log(LogLevel.Critical, message, ...args); - } - override dispose(): void { this._logger?.dispose(); } diff --git a/src/vs/platform/log/common/fileLog.ts b/src/vs/platform/log/common/fileLog.ts index e16363b8b6e..3cb892d2270 100644 --- a/src/vs/platform/log/common/fileLog.ts +++ b/src/vs/platform/log/common/fileLog.ts @@ -70,12 +70,6 @@ export class FileLogger extends AbstractLogger implements ILogger { } } - critical(): void { - if (this.getLevel() <= LogLevel.Critical) { - this._log(LogLevel.Critical, format(arguments)); - } - } - flush(): void { } @@ -129,7 +123,6 @@ export class FileLogger extends AbstractLogger implements ILogger { private stringifyLogLevel(level: LogLevel): string { switch (level) { - case LogLevel.Critical: return 'critical'; case LogLevel.Debug: return 'debug'; case LogLevel.Error: return 'error'; case LogLevel.Info: return 'info'; diff --git a/src/vs/platform/log/common/log.ts b/src/vs/platform/log/common/log.ts index cc0cb8142e9..bdedb244c1c 100644 --- a/src/vs/platform/log/common/log.ts +++ b/src/vs/platform/log/common/log.ts @@ -20,13 +20,12 @@ function now(): string { } export enum LogLevel { + Off, Trace, Debug, Info, Warning, - Error, - Critical, - Off + Error } export const DEFAULT_LOG_LEVEL: LogLevel = LogLevel.Info; @@ -41,7 +40,6 @@ export interface ILogger extends IDisposable { info(message: string, ...args: any[]): void; warn(message: string, ...args: any[]): void; error(message: string | Error, ...args: any[]): void; - critical(message: string | Error, ...args: any[]): void; /** * An operation to flush the contents. Can be synchronous. @@ -56,7 +54,6 @@ export function log(logger: ILogger, level: LogLevel, message: string): void { case LogLevel.Info: logger.info(message); break; case LogLevel.Warning: logger.warn(message); break; case LogLevel.Error: logger.error(message); break; - case LogLevel.Critical: logger.critical(message); break; default: throw new Error('Invalid log level'); } } @@ -198,12 +195,6 @@ export abstract class AbstractMessageLogger extends AbstractLogger implements IL } } - critical(message: string | Error, ...args: any[]): void { - if (this.checkLogLevel(LogLevel.Critical)) { - this.log(LogLevel.Critical, format([message, ...args])); - } - } - flush(): void { } } @@ -268,16 +259,6 @@ export class ConsoleMainLogger extends AbstractLogger implements ILogger { } } - critical(message: string, ...args: any[]): void { - if (this.getLevel() <= LogLevel.Critical) { - if (this.useColors) { - console.error(`\x1b[90m[main ${now()}]\x1b[0m`, message, ...args); - } else { - console.error(`[main ${now()}]`, message, ...args); - } - } - } - override dispose(): void { // noop } @@ -325,12 +306,6 @@ export class ConsoleLogger extends AbstractLogger implements ILogger { } } - critical(message: string, ...args: any[]): void { - if (this.getLevel() <= LogLevel.Critical) { - console.log('%cCRITI', 'background: #f33; color: white', message, ...args); - } - } - override dispose(): void { // noop } @@ -377,12 +352,6 @@ export class AdapterLogger extends AbstractLogger implements ILogger { } } - critical(message: string | Error, ...args: any[]): void { - if (this.getLevel() <= LogLevel.Critical) { - this.adapter.log(LogLevel.Critical, [this.extractMessage(message), ...args]); - } - } - private extractMessage(msg: string | Error): string { if (typeof msg === 'string') { return msg; @@ -447,12 +416,6 @@ export class MultiplexLogService extends AbstractLogger implements ILogService { } } - critical(message: string | Error, ...args: any[]): void { - for (const logService of this.logServices) { - logService.critical(message, ...args); - } - } - flush(): void { for (const logService of this.logServices) { logService.flush(); @@ -506,10 +469,6 @@ export class LogService extends Disposable implements ILogService { this.logger.error(message, ...args); } - critical(message: string | Error, ...args: any[]): void { - this.logger.critical(message, ...args); - } - flush(): void { this.logger.flush(); } @@ -629,6 +588,17 @@ export function getLogLevel(environmentService: IEnvironmentService): LogLevel { return DEFAULT_LOG_LEVEL; } +export function LogLevelToString(logLevel: LogLevel): string { + switch (logLevel) { + case LogLevel.Trace: return 'trace'; + case LogLevel.Debug: return 'debug'; + case LogLevel.Info: return 'info'; + case LogLevel.Warning: return 'warn'; + case LogLevel.Error: return 'error'; + case LogLevel.Off: return 'off'; + } +} + export function parseLogLevel(logLevel: string): LogLevel | undefined { switch (logLevel) { case 'trace': @@ -642,21 +612,9 @@ export function parseLogLevel(logLevel: string): LogLevel | undefined { case 'error': return LogLevel.Error; case 'critical': - return LogLevel.Critical; + return LogLevel.Error; case 'off': return LogLevel.Off; } return undefined; } - -export function LogLevelToString(logLevel: LogLevel): string { - switch (logLevel) { - case LogLevel.Trace: return 'trace'; - case LogLevel.Debug: return 'debug'; - case LogLevel.Info: return 'info'; - case LogLevel.Warning: return 'warn'; - case LogLevel.Error: return 'error'; - case LogLevel.Critical: return 'critical'; - case LogLevel.Off: return 'off'; - } -} diff --git a/src/vs/platform/log/node/spdlogLog.ts b/src/vs/platform/log/node/spdlogLog.ts index b00a30a3dbf..ea160d243cc 100644 --- a/src/vs/platform/log/node/spdlogLog.ts +++ b/src/vs/platform/log/node/spdlogLog.ts @@ -7,6 +7,16 @@ import * as spdlog from 'spdlog'; import { ByteSize } from 'vs/platform/files/common/files'; import { AbstractMessageLogger, ILogger, LogLevel } from 'vs/platform/log/common/log'; +enum SpdLogLevel { + Trace, + Debug, + Info, + Warning, + Error, + Critical, + Off +} + async function createSpdLogLogger(name: string, logfilePath: string, filesize: number, filecount: number, donotUseFormatters: boolean): Promise { // Do not crash if spdlog cannot be loaded try { @@ -37,7 +47,18 @@ function log(logger: spdlog.Logger, level: LogLevel, message: string): void { case LogLevel.Info: logger.info(message); break; case LogLevel.Warning: logger.warn(message); break; case LogLevel.Error: logger.error(message); break; - case LogLevel.Critical: logger.critical(message); break; + default: throw new Error('Invalid log level'); + } +} + +function setLogLevel(logger: spdlog.Logger, level: LogLevel): void { + switch (level) { + case LogLevel.Trace: logger.setLevel(SpdLogLevel.Trace); break; + case LogLevel.Debug: logger.setLevel(SpdLogLevel.Debug); break; + case LogLevel.Info: logger.setLevel(SpdLogLevel.Info); break; + case LogLevel.Warning: logger.setLevel(SpdLogLevel.Warning); break; + case LogLevel.Error: logger.setLevel(SpdLogLevel.Error); break; + case LogLevel.Off: logger.setLevel(SpdLogLevel.Off); break; default: throw new Error('Invalid log level'); } } @@ -59,7 +80,9 @@ export class SpdLogLogger extends AbstractMessageLogger implements ILogger { this.setLevel(level); this._loggerCreationPromise = this._createSpdLogLogger(name, filepath, rotating, donotUseFormatters); this._register(this.onDidChangeLogLevel(level => { - this._logger?.setLevel(level); + if (this._logger) { + setLogLevel(this._logger, level); + } })); } @@ -69,7 +92,7 @@ export class SpdLogLogger extends AbstractMessageLogger implements ILogger { const logger = await createSpdLogLogger(name, filepath, filesize, filecount, donotUseFormatters); if (logger) { this._logger = logger; - this._logger.setLevel(this.getLevel()); + setLogLevel(this._logger, this.getLevel()); for (const { level, message } of this.buffer) { log(this._logger, level, message); } diff --git a/src/vs/platform/telemetry/test/common/telemetryLogAppender.test.ts b/src/vs/platform/telemetry/test/common/telemetryLogAppender.test.ts index b1cb552a339..7386f5c6e0c 100644 --- a/src/vs/platform/telemetry/test/common/telemetryLogAppender.test.ts +++ b/src/vs/platform/telemetry/test/common/telemetryLogAppender.test.ts @@ -48,12 +48,6 @@ class TestTelemetryLogger extends AbstractLogger implements ILogger { } } - critical(message: string, ...args: any[]): void { - if (this.getLevel() <= LogLevel.Critical) { - this.logs.push(message); - } - } - override dispose(): void { } flush(): void { } } diff --git a/src/vs/platform/userDataSync/common/userDataSyncLog.ts b/src/vs/platform/userDataSync/common/userDataSyncLog.ts index 4ebdaf97bc9..43e15330321 100644 --- a/src/vs/platform/userDataSync/common/userDataSyncLog.ts +++ b/src/vs/platform/userDataSync/common/userDataSyncLog.ts @@ -40,10 +40,6 @@ export class UserDataSyncLogService extends AbstractLogger implements IUserDataS this.logger.error(message, ...args); } - critical(message: string | Error, ...args: any[]): void { - this.logger.critical(message, ...args); - } - flush(): void { this.logger.flush(); } diff --git a/src/vs/server/node/serverServices.ts b/src/vs/server/node/serverServices.ts index f7a5dabd6f6..6978f8f6e4f 100644 --- a/src/vs/server/node/serverServices.ts +++ b/src/vs/server/node/serverServices.ts @@ -315,16 +315,6 @@ class ServerLogService extends AbstractLogger implements ILogService { } } - critical(message: string, ...args: any[]): void { - if (this.getLevel() <= LogLevel.Critical) { - if (this.useColors) { - console.error(`\x1b[90m[${now()}]\x1b[0m`, message, ...args); - } else { - console.error(`[${now()}]`, message, ...args); - } - } - } - override dispose(): void { // noop } diff --git a/src/vs/workbench/api/browser/mainThreadLogService.ts b/src/vs/workbench/api/browser/mainThreadLogService.ts index 3d350071c5f..2dbe789a04f 100644 --- a/src/vs/workbench/api/browser/mainThreadLogService.ts +++ b/src/vs/workbench/api/browser/mainThreadLogService.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { extHostNamedCustomer, IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; -import { ILoggerOptions, ILoggerService, ILogService, log, LogLevel } from 'vs/platform/log/common/log'; +import { ILoggerOptions, ILoggerService, ILogService, log, LogLevel, LogLevelToString, parseLogLevel } from 'vs/platform/log/common/log'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { ExtHostContext, MainThreadLoggerShape, MainContext } from 'vs/workbench/api/common/extHost.protocol'; import { UriComponents, URI } from 'vs/base/common/uri'; @@ -59,17 +59,20 @@ export class MainThreadLoggerService implements MainThreadLoggerShape { // --- Internal commands to improve extension test runs -CommandsRegistry.registerCommand('_extensionTests.setLogLevel', function (accessor: ServicesAccessor, level: number) { +CommandsRegistry.registerCommand('_extensionTests.setLogLevel', function (accessor: ServicesAccessor, level: string) { const logService = accessor.get(ILogService); const environmentService = accessor.get(IEnvironmentService); if (environmentService.isExtensionDevelopment && !!environmentService.extensionTestsLocationURI) { - logService.setLevel(level); + const logLevel = parseLogLevel(level); + if (logLevel !== undefined) { + logService.setLevel(logLevel); + } } }); CommandsRegistry.registerCommand('_extensionTests.getLogLevel', function (accessor: ServicesAccessor) { const logService = accessor.get(ILogService); - return logService.getLevel(); + return LogLevelToString(logService.getLevel()); }); diff --git a/src/vs/workbench/api/node/proxyResolver.ts b/src/vs/workbench/api/node/proxyResolver.ts index ba751992465..6fa5920c594 100644 --- a/src/vs/workbench/api/node/proxyResolver.ts +++ b/src/vs/workbench/api/node/proxyResolver.ts @@ -37,7 +37,7 @@ export function connectProxyResolver( case LogLevel.Info: extHostLogService.info(message, ...args); break; case LogLevel.Warning: extHostLogService.warn(message, ...args); break; case LogLevel.Error: extHostLogService.error(message, ...args); break; - case LogLevel.Critical: extHostLogService.critical(message, ...args); break; + case LogLevel.Critical: extHostLogService.error(message, ...args); break; case LogLevel.Off: break; default: never(level, message, args); break; } diff --git a/src/vs/workbench/contrib/bulkEdit/browser/bulkFileEdits.ts b/src/vs/workbench/contrib/bulkEdit/browser/bulkFileEdits.ts index cea77beb41a..88408ccfe96 100644 --- a/src/vs/workbench/contrib/bulkEdit/browser/bulkFileEdits.ts +++ b/src/vs/workbench/contrib/bulkEdit/browser/bulkFileEdits.ts @@ -256,7 +256,7 @@ class DeleteOperation implements IFileOperation { try { fileContent = await this._fileService.readFile(edit.oldUri); } catch (err) { - this._logService.critical(err); + this._logService.error(err); } } if (fileContent !== undefined) { diff --git a/src/vs/workbench/contrib/editSessions/common/editSessionsLogService.ts b/src/vs/workbench/contrib/editSessions/common/editSessionsLogService.ts index a18c9e29304..da2dc48823a 100644 --- a/src/vs/workbench/contrib/editSessions/common/editSessionsLogService.ts +++ b/src/vs/workbench/contrib/editSessions/common/editSessionsLogService.ts @@ -40,10 +40,6 @@ export class EditSessionsLogService extends AbstractLogger implements IEditSessi this.logger.error(message, ...args); } - critical(message: string | Error, ...args: any[]): void { - this.logger.critical(message, ...args); - } - flush(): void { this.logger.flush(); } diff --git a/src/vs/workbench/contrib/logs/common/logsActions.ts b/src/vs/workbench/contrib/logs/common/logsActions.ts index 3e9559f30ac..bc1e7c73bc7 100644 --- a/src/vs/workbench/contrib/logs/common/logsActions.ts +++ b/src/vs/workbench/contrib/logs/common/logsActions.ts @@ -78,7 +78,6 @@ export class SetLogLevelAction extends Action { { label: this.getLabel(nls.localize('info', "Info"), LogLevel.Info, current), level: LogLevel.Info, description: this.getDescription(LogLevel.Info, defaultLogLevel) }, { label: this.getLabel(nls.localize('warn', "Warning"), LogLevel.Warning, current), level: LogLevel.Warning, description: this.getDescription(LogLevel.Warning, defaultLogLevel) }, { label: this.getLabel(nls.localize('err', "Error"), LogLevel.Error, current), level: LogLevel.Error, description: this.getDescription(LogLevel.Error, defaultLogLevel) }, - { label: this.getLabel(nls.localize('critical', "Critical"), LogLevel.Critical, current), level: LogLevel.Critical, description: this.getDescription(LogLevel.Critical, defaultLogLevel) }, { label: this.getLabel(nls.localize('off', "Off"), LogLevel.Off, current), level: LogLevel.Off, description: this.getDescription(LogLevel.Off, defaultLogLevel) }, ]; diff --git a/src/vs/workbench/contrib/notebook/common/notebookEditorModelResolverServiceImpl.ts b/src/vs/workbench/contrib/notebook/common/notebookEditorModelResolverServiceImpl.ts index bc34431e3f5..24d1a387078 100644 --- a/src/vs/workbench/contrib/notebook/common/notebookEditorModelResolverServiceImpl.ts +++ b/src/vs/workbench/contrib/notebook/common/notebookEditorModelResolverServiceImpl.ts @@ -123,7 +123,7 @@ class NotebookModelReferenceCollection extends ReferenceCollection { - this._logService.critical('FAILED to destory notebook', err); + this._logService.error('FAILED to destory notebook', err); }); } } diff --git a/src/vs/workbench/services/extensions/common/abstractExtensionService.ts b/src/vs/workbench/services/extensions/common/abstractExtensionService.ts index acccff1f096..053cc45f822 100644 --- a/src/vs/workbench/services/extensions/common/abstractExtensionService.ts +++ b/src/vs/workbench/services/extensions/common/abstractExtensionService.ts @@ -1518,7 +1518,7 @@ class ProposedApiController { extension.enabledApiProposals = extension.enabledApiProposals.filter(name => { const result = Boolean(allApiProposals[name]); if (!result) { - this._logService.critical(`Extension '${key}' wants API proposal '${name}' but that proposal DOES NOT EXIST. Likely, the proposal has been finalized (check 'vscode.d.ts') or was abandoned.`); + this._logService.error(`Extension '${key}' wants API proposal '${name}' but that proposal DOES NOT EXIST. Likely, the proposal has been finalized (check 'vscode.d.ts') or was abandoned.`); } return result; }); @@ -1537,10 +1537,10 @@ class ProposedApiController { const extensionSet = new Set(extension.enabledApiProposals); const diff = new Set([...extensionSet].filter(a => !productSet.has(a))); if (diff.size > 0) { - this._logService.critical(`Extension '${key}' appears in product.json but enables LESS API proposals than the extension wants.\npackage.json (LOSES): ${[...extensionSet].join(', ')}\nproduct.json (WINS): ${[...productSet].join(', ')}`); + this._logService.error(`Extension '${key}' appears in product.json but enables LESS API proposals than the extension wants.\npackage.json (LOSES): ${[...extensionSet].join(', ')}\nproduct.json (WINS): ${[...productSet].join(', ')}`); if (this._environmentService.isExtensionDevelopment) { - this._logService.critical(`Proceeding with EXTRA proposals (${[...diff].join(', ')}) because extension is in development mode. Still, this EXTENSION WILL BE BROKEN unless product.json is updated.`); + this._logService.error(`Proceeding with EXTRA proposals (${[...diff].join(', ')}) because extension is in development mode. Still, this EXTENSION WILL BE BROKEN unless product.json is updated.`); productEnabledProposals.push(...diff); } } @@ -1557,7 +1557,7 @@ class ProposedApiController { if (!extension.isBuiltin && isNonEmptyArray(extension.enabledApiProposals)) { // restrictive: extension cannot use proposed API in this context and its declaration is nulled - this._logService.critical(`Extension '${extension.identifier.value} CANNOT USE these API proposals '${extension.enabledApiProposals?.join(', ') || '*'}'. You MUST start in extension development mode or use the --enable-proposed-api command line flag`); + this._logService.error(`Extension '${extension.identifier.value} CANNOT USE these API proposals '${extension.enabledApiProposals?.join(', ') || '*'}'. You MUST start in extension development mode or use the --enable-proposed-api command line flag`); extension.enabledApiProposals = []; } } diff --git a/src/vs/workbench/services/extensions/common/extensionHostManager.ts b/src/vs/workbench/services/extensions/common/extensionHostManager.ts index 08c6b0bee93..bfbc03d4f9c 100644 --- a/src/vs/workbench/services/extensions/common/extensionHostManager.ts +++ b/src/vs/workbench/services/extensions/common/extensionHostManager.ts @@ -298,8 +298,8 @@ class ExtensionHostManager extends Disposable implements IExtensionHostManager { this._customers.push(instance); this._rpcProtocol.set(id, instance); } catch (err) { - this._logService.critical(`Cannot instantiate named customer: '${id.sid}'`); - this._logService.critical(err); + this._logService.error(`Cannot instantiate named customer: '${id.sid}'`); + this._logService.error(err); errors.onUnexpectedError(err); } } @@ -311,7 +311,7 @@ class ExtensionHostManager extends Disposable implements IExtensionHostManager { const instance = this._instantiationService.createInstance(ctor, extHostContext); this._customers.push(instance); } catch (err) { - this._logService.critical(err); + this._logService.error(err); errors.onUnexpectedError(err); } } diff --git a/src/vscode-dts/vscode.proposed.extensionLog.d.ts b/src/vscode-dts/vscode.proposed.extensionLog.d.ts index f78106e0e26..1dfb8f63a22 100644 --- a/src/vscode-dts/vscode.proposed.extensionLog.d.ts +++ b/src/vscode-dts/vscode.proposed.extensionLog.d.ts @@ -6,13 +6,12 @@ declare module 'vscode' { export enum LogLevel { - Trace = 0, - Debug = 1, - Info = 2, - Warning = 3, - Error = 4, - Critical = 5, - Off = 6 + Off = 0, + Trace = 1, + Debug = 2, + Info = 3, + Warning = 4, + Error = 5, } export namespace env { From 3a8b7e427699ecc1c411e7874cdef7f32cb8acba Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 1 Nov 2022 08:00:38 -0700 Subject: [PATCH 010/185] Highlight label should not create extra span nodes (#164657) * Highlight label should not create extra empty dom nodes I noticed that the `HighlightedLabel` class creates extra `span` elements for text ranges. These should not be needed. Using text children directly should be faster for creation and also reduce the number of nodes in the document I also related the conditional spread with a longer version that uses a simple call to push. This is worth doing since `HighlightedLabel` is so widely used in the editor * Update tests * Update smoke test selector * Update css --- .../ui/highlightedlabel/highlightedLabel.ts | 14 +++++++++++--- .../parts/quickinput/browser/media/quickInput.css | 2 +- src/vs/base/test/browser/highlightedLabel.test.ts | 10 +++++----- test/automation/src/quickinput.ts | 2 +- 4 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/vs/base/browser/ui/highlightedlabel/highlightedLabel.ts b/src/vs/base/browser/ui/highlightedlabel/highlightedLabel.ts index ed58c930af3..ef5cf2ce7a3 100644 --- a/src/vs/base/browser/ui/highlightedlabel/highlightedLabel.ts +++ b/src/vs/base/browser/ui/highlightedlabel/highlightedLabel.ts @@ -85,7 +85,7 @@ export class HighlightedLabel { private render(): void { - const children: HTMLSpanElement[] = []; + const children: Array = []; let pos = 0; for (const highlight of this.highlights) { @@ -95,7 +95,11 @@ export class HighlightedLabel { if (pos < highlight.start) { const substring = this.text.substring(pos, highlight.start); - children.push(dom.$('span', undefined, ...this.supportIcons ? renderLabelWithIcons(substring) : [substring])); + if (this.supportIcons) { + children.push(...renderLabelWithIcons(substring)); + } else { + children.push(substring); + } pos = highlight.start; } @@ -112,7 +116,11 @@ export class HighlightedLabel { if (pos < this.text.length) { const substring = this.text.substring(pos,); - children.push(dom.$('span', undefined, ...this.supportIcons ? renderLabelWithIcons(substring) : [substring])); + if (this.supportIcons) { + children.push(...renderLabelWithIcons(substring)); + } else { + children.push(substring); + } } dom.reset(this.domNode, ...children); diff --git a/src/vs/base/parts/quickinput/browser/media/quickInput.css b/src/vs/base/parts/quickinput/browser/media/quickInput.css index c1f60c0d2b9..d197bf0ffa0 100644 --- a/src/vs/base/parts/quickinput/browser/media/quickInput.css +++ b/src/vs/base/parts/quickinput/browser/media/quickInput.css @@ -237,7 +237,7 @@ vertical-align: text-bottom; } -.quick-input-list .quick-input-list-rows .monaco-highlighted-label span { +.quick-input-list .quick-input-list-rows .monaco-highlighted-label > * { opacity: 1; } diff --git a/src/vs/base/test/browser/highlightedLabel.test.ts b/src/vs/base/test/browser/highlightedLabel.test.ts index 6de166b8234..1bff745515b 100644 --- a/src/vs/base/test/browser/highlightedLabel.test.ts +++ b/src/vs/base/test/browser/highlightedLabel.test.ts @@ -19,12 +19,12 @@ suite('HighlightedLabel', () => { test('no decorations', function () { label.set('hello'); - assert.strictEqual(label.element.innerHTML, 'hello'); + assert.strictEqual(label.element.innerHTML, 'hello'); }); test('escape html', function () { label.set('helhel<lo'); + assert.strictEqual(label.element.innerHTML, 'hel<lo'); }); test('everything highlighted', function () { @@ -34,17 +34,17 @@ suite('HighlightedLabel', () => { test('beginning highlighted', function () { label.set('hellothere', [{ start: 0, end: 5 }]); - assert.strictEqual(label.element.innerHTML, 'hellothere'); + assert.strictEqual(label.element.innerHTML, 'hellothere'); }); test('ending highlighted', function () { label.set('goodbye', [{ start: 4, end: 7 }]); - assert.strictEqual(label.element.innerHTML, 'goodbye'); + assert.strictEqual(label.element.innerHTML, 'goodbye'); }); test('middle highlighted', function () { label.set('foobarfoo', [{ start: 3, end: 6 }]); - assert.strictEqual(label.element.innerHTML, 'foobarfoo'); + assert.strictEqual(label.element.innerHTML, 'foobarfoo'); }); test('escapeNewLines', () => { diff --git a/test/automation/src/quickinput.ts b/test/automation/src/quickinput.ts index e4269b0d99e..382fd328ce3 100644 --- a/test/automation/src/quickinput.ts +++ b/test/automation/src/quickinput.ts @@ -12,7 +12,7 @@ export class QuickInput { private static QUICK_INPUT_ROW = `${QuickInput.QUICK_INPUT} .quick-input-list .monaco-list-row`; private static QUICK_INPUT_FOCUSED_ELEMENT = `${QuickInput.QUICK_INPUT_ROW}.focused .monaco-highlighted-label`; private static QUICK_INPUT_ENTRY_LABEL = `${QuickInput.QUICK_INPUT_ROW} .label-name`; - private static QUICK_INPUT_ENTRY_LABEL_SPAN = `${QuickInput.QUICK_INPUT_ROW} .monaco-highlighted-label span`; + private static QUICK_INPUT_ENTRY_LABEL_SPAN = `${QuickInput.QUICK_INPUT_ROW} .monaco-highlighted-label`; constructor(private code: Code) { } From ccda6721ea81928f96bcb243768b68be849f5774 Mon Sep 17 00:00:00 2001 From: Logan Ramos Date: Tue, 1 Nov 2022 11:49:56 -0400 Subject: [PATCH 011/185] lramos15/xenacious-bedbug (#165083) * Don't shortcircuit active editor in Resolver * Fix broken test --- .../services/editor/browser/editorResolverService.ts | 7 ------- .../editor/test/browser/editorService.test.ts | 12 ++++++++---- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/src/vs/workbench/services/editor/browser/editorResolverService.ts b/src/vs/workbench/services/editor/browser/editorResolverService.ts index 6731ee8717c..18b9a9559e7 100644 --- a/src/vs/workbench/services/editor/browser/editorResolverService.ts +++ b/src/vs/workbench/services/editor/browser/editorResolverService.ts @@ -114,7 +114,6 @@ export class EditorResolverService extends Disposable implements IEditorResolver } let resource = EditorResourceAccessor.getCanonicalUri(untypedEditor, { supportSideBySide: SideBySideEditor.PRIMARY }); - const options = untypedEditor.options; // If it was resolved before we await for the extensions to activate and then proceed with resolution or else the backing extensions won't be registered if (this.cache && resource && this.resourceMatchesCache(resource)) { @@ -178,12 +177,6 @@ export class EditorResolverService extends Disposable implements IEditorResolver return ResolvedStatus.NONE; } - // If it's the currently active editor we shouldn't do anything - const activeEditor = group.activeEditor; - const isActive = activeEditor ? activeEditor.matches(untypedEditor) : false; - if (activeEditor && isActive) { - return { editor: activeEditor, options, group }; - } const input = await this.doResolveEditor(untypedEditor, group, selectedEditor); if (conflictingDefault && input) { // Show the conflicting default dialog diff --git a/src/vs/workbench/services/editor/test/browser/editorService.test.ts b/src/vs/workbench/services/editor/test/browser/editorService.test.ts index b1ed8b75d2b..fb23ed1feee 100644 --- a/src/vs/workbench/services/editor/test/browser/editorService.test.ts +++ b/src/vs/workbench/services/editor/test/browser/editorService.test.ts @@ -7,7 +7,7 @@ import * as assert from 'assert'; import { EditorActivation, IResourceEditorInput } from 'vs/platform/editor/common/editor'; import { URI } from 'vs/base/common/uri'; import { Event } from 'vs/base/common/event'; -import { DEFAULT_EDITOR_ASSOCIATION, EditorCloseContext, EditorsOrder, IEditorCloseEvent, EditorInputWithOptions, IEditorPane, IResourceDiffEditorInput, isEditorInputWithOptions, IUntitledTextResourceEditorInput, IUntypedEditorInput, SideBySideEditor } from 'vs/workbench/common/editor'; +import { DEFAULT_EDITOR_ASSOCIATION, EditorCloseContext, EditorsOrder, IEditorCloseEvent, EditorInputWithOptions, IEditorPane, IResourceDiffEditorInput, isEditorInputWithOptions, IUntitledTextResourceEditorInput, IUntypedEditorInput, SideBySideEditor, isEditorInput } from 'vs/workbench/common/editor'; import { workbenchInstantiationService, TestServiceAccessor, registerTestEditor, TestFileEditorInput, ITestInstantiationService, registerTestResourceEditor, registerTestSideBySideEditor, createEditorPart, registerTestFileEditor, TestTextFileEditor, TestSingletonFileEditorInput } from 'vs/workbench/test/browser/workbenchTestServices'; import { EditorService } from 'vs/workbench/services/editor/browser/editorService'; import { IEditorGroup, IEditorGroupsService, GroupDirection, GroupsArrangement } from 'vs/workbench/services/editor/common/editorGroupsService'; @@ -602,8 +602,13 @@ suite('EditorService', () => { async function openEditor(editor: EditorInputWithOptions | IUntypedEditorInput, group?: PreferredGroup): Promise { if (useOpenEditors) { + // The type safety isn't super good here, so we assist with runtime checks + // Open editors expects untyped or editor input with options, you cannot pass a typed editor input + // without options + if (!isEditorInputWithOptions(editor) && isEditorInput(editor)) { + editor = { editor: editor, options: {} }; + } const panes = await service.openEditors([editor], group); - return panes[0]; } @@ -651,7 +656,7 @@ suite('EditorService', () => { assert.ok(typedEditor instanceof TestFileEditorInput); assert.strictEqual(typedEditor?.resource?.toString(), untypedEditorReplacement.resource.toString()); - assert.strictEqual(editorFactoryCalled, 2); + assert.strictEqual(editorFactoryCalled, 3); assert.strictEqual(untitledEditorFactoryCalled, 0); assert.strictEqual(diffEditorFactoryCalled, 0); @@ -881,7 +886,6 @@ suite('EditorService', () => { assert.strictEqual(untitledEditorFactoryCalled, 0); assert.strictEqual(diffEditorFactoryCalled, 0); - assert.ok(!lastEditorFactoryEditor); assert.ok(!lastUntitledEditorFactoryEditor); assert.ok(!lastDiffEditorFactoryEditor); From 8485263426b5317bb206566252ab1720fbe0d89a Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 1 Nov 2022 17:03:16 +0100 Subject: [PATCH 012/185] debt - use CSS variables instead of `registerThemingParticipant` (#165164) --- .../gotoSymbol/browser/link/goToDefinitionAtPosition.css | 3 ++- .../gotoSymbol/browser/link/goToDefinitionAtPosition.ts | 9 --------- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/src/vs/editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition.css b/src/vs/editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition.css index 3361b104429..ad7847d3626 100644 --- a/src/vs/editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition.css +++ b/src/vs/editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition.css @@ -6,4 +6,5 @@ .monaco-editor .goto-definition-link { text-decoration: underline; cursor: pointer; -} \ No newline at end of file + color: var(--vscode-editorLink-activeForeground) !important; +} diff --git a/src/vs/editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition.ts b/src/vs/editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition.ts index 48ec76ca093..4f6c0f808f6 100644 --- a/src/vs/editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition.ts +++ b/src/vs/editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition.ts @@ -27,8 +27,6 @@ import { PeekContext } from 'vs/editor/contrib/peekView/browser/peekView'; import * as nls from 'vs/nls'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; -import { editorActiveLinkForeground } from 'vs/platform/theme/common/colorRegistry'; -import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { DefinitionAction } from '../goToCommands'; import { getDefinitionsAtPosition } from '../goToSymbol'; import { IWordAtPosition } from 'vs/editor/common/core/wordHelper'; @@ -314,10 +312,3 @@ export class GotoDefinitionAtPositionEditorContribution implements IEditorContri } registerEditorContribution(GotoDefinitionAtPositionEditorContribution.ID, GotoDefinitionAtPositionEditorContribution); - -registerThemingParticipant((theme, collector) => { - const activeLinkForeground = theme.getColor(editorActiveLinkForeground); - if (activeLinkForeground) { - collector.addRule(`.monaco-editor .goto-definition-link { color: ${activeLinkForeground} !important; }`); - } -}); From a64d5346e8c7dfe7c20b4b5cc9e0c33cd1c449f8 Mon Sep 17 00:00:00 2001 From: Jean Pierre Date: Tue, 1 Nov 2022 11:29:47 -0500 Subject: [PATCH 013/185] Fixes task reconnection status does not work for default build task (#165110) Fixes #159639 Co-authored-by: Megan Rogge --- .../tasks/browser/abstractTaskService.ts | 11 +--- .../contrib/tasks/browser/taskService.ts | 11 ++-- .../tasks/browser/terminalTaskSystem.ts | 13 +---- .../contrib/tasks/common/taskSystem.ts | 1 - .../contrib/terminal/browser/terminal.ts | 2 - .../terminal/browser/terminalService.ts | 50 ++----------------- .../contrib/terminal/browser/terminalView.ts | 24 ++++----- 7 files changed, 21 insertions(+), 91 deletions(-) diff --git a/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts b/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts index b88a6c4cd66..6e2ef078aae 100644 --- a/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts +++ b/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts @@ -220,7 +220,6 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer protected _outputChannel: IOutputChannel; protected readonly _onDidStateChange: Emitter; - protected readonly _onDidReconnectToTerminals: Emitter = new Emitter(); private _waitForSupportedExecutions: Promise; private _onDidRegisterSupportedExecutions: Emitter = new Emitter(); private _onDidChangeTaskSystemInfo: Emitter = new Emitter(); @@ -374,10 +373,8 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer return; } this._getTaskSystem(); - this._waitForSupportedExecutions.then(() => { - this.getWorkspaceTasks().then(async () => { - this._tasksReconnected = await this._reconnectTasks(); - }); + this.getWorkspaceTasks().then(async () => { + this._tasksReconnected = await this._reconnectTasks(); }); } @@ -403,10 +400,6 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer return this._onDidStateChange.event; } - public get onDidReconnectToTerminals(): Event { - return this._onDidReconnectToTerminals.event; - } - public get supportsMultipleTaskExecutions(): boolean { return this.inTerminal(); } diff --git a/src/vs/workbench/contrib/tasks/browser/taskService.ts b/src/vs/workbench/contrib/tasks/browser/taskService.ts index 2107166b2ce..112a688a4c2 100644 --- a/src/vs/workbench/contrib/tasks/browser/taskService.ts +++ b/src/vs/workbench/contrib/tasks/browser/taskService.ts @@ -18,17 +18,14 @@ export class TaskService extends AbstractTaskService { if (this._taskSystem) { return this._taskSystem; } - if (this.executionEngine === ExecutionEngine.Terminal) { - this._taskSystem = this._createTerminalTaskSystem(); - } else { + if (this.executionEngine !== ExecutionEngine.Terminal) { throw new Error(TaskService.ProcessTaskSystemSupportMessage); } - const taskSystem = this._createTerminalTaskSystem(); - this._taskSystem = taskSystem; + this._taskSystem = this._createTerminalTaskSystem(); this._taskSystemListeners = [ - taskSystem.onDidStateChange((event) => { - this._taskRunningState.set(taskSystem.isActiveSync()); + this._taskSystem.onDidStateChange((event) => { + this._taskRunningState.set(this._taskSystem!.isActiveSync()); this._onDidStateChange.fire(event); }), ]; diff --git a/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts b/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts index cdde68d139c..494325996a3 100644 --- a/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts +++ b/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts @@ -211,7 +211,6 @@ export class TerminalTaskSystem extends Disposable implements ITaskSystem { private _terminalCreationQueue: Promise = Promise.resolve(); private _hasReconnected: boolean = false; private readonly _onDidStateChange: Emitter; - private readonly _onDidReconnectToTerminals: Emitter = new Emitter(); private _reconnectedTerminals: ITerminalInstance[] | undefined; get taskShellIntegrationStartSequence(): string { @@ -261,10 +260,6 @@ export class TerminalTaskSystem extends Disposable implements ITaskSystem { return this._onDidStateChange.event; } - public get onDidReconnectToTerminals(): Event { - return this._onDidReconnectToTerminals.event; - } - private _log(value: string): void { this._appendOutput(value + '\n'); } @@ -274,9 +269,7 @@ export class TerminalTaskSystem extends Disposable implements ITaskSystem { } public reconnect(task: Task, resolver: ITaskResolver): ITaskExecuteResult { - if (!this._hasReconnected) { - this._reconnectToTerminals(); - } + this._reconnectToTerminals(); return this.run(task, resolver, Triggers.reconnect); } @@ -1338,8 +1331,6 @@ export class TerminalTaskSystem extends Disposable implements ITaskSystem { this._logService.trace(`Attempting reconnection of ${this._reconnectedTerminals?.length} terminals`); if (!this._reconnectedTerminals?.length) { this._logService.trace(`No terminals to reconnect to so returning`); - this._hasReconnected = true; - return; } else { for (const terminal of this._reconnectedTerminals) { const task = terminal.shellLaunchConfig.attachPersistentProcess?.reconnectionProperties?.data as IReconnectionTaskData; @@ -1352,8 +1343,8 @@ export class TerminalTaskSystem extends Disposable implements ITaskSystem { const terminalData = { lastTask: task.lastTask, group: task.group, terminal }; this._terminals[terminal.instanceId] = terminalData; } - this._hasReconnected = true; } + this._hasReconnected = true; } private _deleteTaskAndTerminal(terminal: ITerminalInstance, terminalData: ITerminalData): void { diff --git a/src/vs/workbench/contrib/tasks/common/taskSystem.ts b/src/vs/workbench/contrib/tasks/common/taskSystem.ts index 6eb16987745..570252ef92c 100644 --- a/src/vs/workbench/contrib/tasks/common/taskSystem.ts +++ b/src/vs/workbench/contrib/tasks/common/taskSystem.ts @@ -102,7 +102,6 @@ export interface ITaskSystemInfoResolver { export interface ITaskSystem { onDidStateChange: Event; - onDidReconnectToTerminals: Event; reconnect(task: Task, resolver: ITaskResolver): ITaskExecuteResult; run(task: Task, resolver: ITaskResolver): ITaskExecuteResult; rerun(): ITaskExecuteResult | undefined; diff --git a/src/vs/workbench/contrib/terminal/browser/terminal.ts b/src/vs/workbench/contrib/terminal/browser/terminal.ts index 1795499de42..f78fa85e684 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminal.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminal.ts @@ -135,9 +135,7 @@ export interface ITerminalService extends ITerminalInstanceHost { isProcessSupportRegistered: boolean; readonly connectionState: TerminalConnectionState; readonly defaultLocation: TerminalLocation; - readonly primaryBackendRegistered: Promise; - initializeTerminals(): Promise; onDidChangeActiveGroup: Event; onDidDisposeGroup: Event; onDidCreateInstance: Event; diff --git a/src/vs/workbench/contrib/terminal/browser/terminalService.ts b/src/vs/workbench/contrib/terminal/browser/terminalService.ts index a8c551c5700..c0eb8a64814 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalService.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalService.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as dom from 'vs/base/browser/dom'; -import { Barrier, timeout } from 'vs/base/common/async'; +import { timeout } from 'vs/base/common/async'; import { debounce } from 'vs/base/common/decorators'; import { Emitter, Event } from 'vs/base/common/event'; import { dispose, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; @@ -20,7 +20,6 @@ import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ILogService } from 'vs/platform/log/common/log'; import { INotificationService } from 'vs/platform/notification/common/notification'; -import { IStorageService, StorageScope, StorageTarget, WillSaveStateReason } from 'vs/platform/storage/common/storage'; import { ICreateContributedTerminalProfileOptions, IShellLaunchConfig, ITerminalLaunchError, ITerminalsLayoutInfo, ITerminalsLayoutInfoById, TerminalExitReason, TerminalLocation, TerminalLocationString, TitleEventSource } from 'vs/platform/terminal/common/terminal'; import { formatMessageForTerminal } from 'vs/platform/terminal/common/terminalStrings'; import { iconForeground } from 'vs/platform/theme/common/colorRegistry'; @@ -30,7 +29,6 @@ import { IThemeService, Themable, ThemeIcon } from 'vs/platform/theme/common/the import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { VirtualWorkspaceContext } from 'vs/workbench/common/contextkeys'; import { IEditableData, IViewsService } from 'vs/workbench/common/views'; -import { TaskSettingId } from 'vs/workbench/contrib/tasks/common/tasks'; import { ICreateTerminalOptions, IRequestAddInstanceToGroupEvent, ITerminalEditorService, ITerminalExternalLinkProvider, ITerminalGroup, ITerminalGroupService, ITerminalInstance, ITerminalInstanceHost, ITerminalInstanceService, ITerminalLocationOptions, ITerminalService, ITerminalServiceNativeDelegate, TerminalConnectionState, TerminalEditorLocation } from 'vs/workbench/contrib/terminal/browser/terminal'; import { getCwdForSplit } from 'vs/workbench/contrib/terminal/browser/terminalActions'; import { TerminalConfigHelper } from 'vs/workbench/contrib/terminal/browser/terminalConfigHelper'; @@ -70,8 +68,6 @@ export class TerminalService implements ITerminalService { private _terminalHasBeenCreated: IContextKey; private _terminalCountContextKey: IContextKey; private _configHelper: TerminalConfigHelper; - private _remoteTerminalsInitPromise: Promise | undefined; - private _localTerminalsInitPromise: Promise | undefined; private _connectionState: TerminalConnectionState = TerminalConnectionState.Connecting; private _nativeDelegate?: ITerminalServiceNativeDelegate; private _shutdownWindowCount?: number; @@ -86,11 +82,6 @@ export class TerminalService implements ITerminalService { return this._terminalGroupService.instances.concat(this._terminalEditorService.instances); } - private _primaryBackendRegistered: Barrier = new Barrier(); - get primaryBackendRegistered(): Promise { - return this._primaryBackendRegistered.wait().then(() => { }); - } - private _reconnectedTerminals: Map = new Map(); getReconnectedTerminals(reconnectionOwner: string): ITerminalInstance[] | undefined { return this._reconnectedTerminals.get(reconnectionOwner); @@ -158,7 +149,6 @@ export class TerminalService implements ITerminalService { constructor( @IContextKeyService private _contextKeyService: IContextKeyService, @ILifecycleService private readonly _lifecycleService: ILifecycleService, - @IStorageService private readonly _storageService: IStorageService, @ILogService private readonly _logService: ILogService, @IDialogService private _dialogService: IDialogService, @IInstantiationService private _instantiationService: IInstantiationService, @@ -221,21 +211,6 @@ export class TerminalService implements ITerminalService { _lifecycleService.onBeforeShutdown(async e => e.veto(this._onBeforeShutdown(e.reason), 'veto.terminal')); _lifecycleService.onWillShutdown(e => this._onWillShutdown(e)); - if (this._configurationService.getValue(TaskSettingId.Reconnection)) { - // in order to reconnect to tasks, we have to show the panel - const reconnectToTaskKey = 'reconnectToTasks'; - this._storageService.onWillSaveState((e) => { - if (e.reason === WillSaveStateReason.SHUTDOWN) { - this._storageService.store(reconnectToTaskKey, this.instances.some(i => i.shellLaunchConfig.type === 'Task'), StorageScope.WORKSPACE, StorageTarget.USER); - } - }); - if (this._storageService.getBoolean(reconnectToTaskKey, StorageScope.WORKSPACE)) { - this._viewsService.openView(TERMINAL_VIEW_ID).then(() => { - this._storageService.store(reconnectToTaskKey, false, StorageScope.WORKSPACE, StorageTarget.USER); - }); - } - } - // Create async as the class depends on `this` timeout(0).then(() => this._instantiationService.createInstance(TerminalEditorStyle, document.head)); } @@ -291,17 +266,13 @@ export class TerminalService implements ITerminalService { const isPersistentRemote = !!this._environmentService.remoteAuthority && enableTerminalReconnection; if (isPersistentRemote) { - this._remoteTerminalsInitPromise = this._reconnectToRemoteTerminals(); + this._reconnectToRemoteTerminals().then(() => this._setConnected()); } else if (enableTerminalReconnection) { - this._localTerminalsInitPromise = this._reconnectToLocalTerminals(); + this._reconnectToLocalTerminals().then(() => this._setConnected()); } else { - this._connectionState = TerminalConnectionState.Connected; + Promise.resolve().then(() => this._setConnected()); } - // Open the primary backend registered barrier to allow ITerminalService consumers to - // start using the backend - this._primaryBackendRegistered.open(); - backend.onDidRequestDetach(async (e) => { const instanceToDetach = this.getInstanceFromResource(getTerminalUri(e.workspaceId, e.instanceId)); if (instanceToDetach) { @@ -753,19 +724,6 @@ export class TerminalService implements ITerminalService { return this.instances.some(term => term.processId === remoteTerm.pid); } - async initializeTerminals(): Promise { - if (this._remoteTerminalsInitPromise) { - await this._remoteTerminalsInitPromise; - this._setConnected(); - } else if (this._localTerminalsInitPromise) { - await this._localTerminalsInitPromise; - this._setConnected(); - } - if (this._terminalGroupService.groups.length === 0 && this.isProcessSupportRegistered) { - this.createTerminal({ location: TerminalLocation.Panel }); - } - } - moveToEditor(source: ITerminalInstance): void { if (source.target === TerminalLocation.Editor) { return; diff --git a/src/vs/workbench/contrib/terminal/browser/terminalView.ts b/src/vs/workbench/contrib/terminal/browser/terminalView.ts index 19609d162d6..672b8c00cc8 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalView.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalView.ts @@ -52,7 +52,6 @@ export class TerminalViewPane extends ViewPane { private _parentDomElement: HTMLElement | undefined; private _terminalTabbedView?: TerminalTabbedView; get terminalTabbedView(): TerminalTabbedView | undefined { return this._terminalTabbedView; } - private _terminalsInitialized = false; private _isWelcomeShowing: boolean = false; private _newDropdown: DropdownWithPrimaryActionViewItem | undefined; private readonly _dropdownMenu: IMenu; @@ -132,6 +131,12 @@ export class TerminalViewPane extends ViewPane { return (decorationsEnabled === 'both' || decorationsEnabled === 'gutter') && this._configurationService.getValue(TerminalSettingId.ShellIntegrationEnabled); } + private _initializeTerminal() { + if (this.isBodyVisible() && this._terminalService.isProcessSupportRegistered && this._terminalService.connectionState === TerminalConnectionState.Connected && !this._terminalGroupService.groups.length) { + this._terminalService.createTerminal({ location: TerminalLocation.Panel }); + } + } + override renderBody(container: HTMLElement): void { super.renderBody(container); @@ -164,22 +169,10 @@ export class TerminalViewPane extends ViewPane { this._register(this.onDidChangeBodyVisibility(async visible => { this._viewShowing.set(visible); if (visible) { - const hadTerminals = !!this._terminalGroupService.groups.length; - // Ensure the primary backend is registered as it's important to do before - // initializeTerminals is called. - await this._terminalService.primaryBackendRegistered; - if (this._terminalService.isProcessSupportRegistered) { - if (this._terminalsInitialized) { - if (!hadTerminals) { - this._terminalService.createTerminal({ location: TerminalLocation.Panel }); - } - } else { - this._terminalsInitialized = true; - this._terminalService.initializeTerminals(); - } - } else { + if (!this._terminalService.isProcessSupportRegistered) { this._onDidChangeViewWelcomeState.fire(); } + this._initializeTerminal(); // we don't know here whether or not it should be focused, so // defer focusing the panel to the focus() call // to prevent overriding preserveFocus for extensions @@ -191,6 +184,7 @@ export class TerminalViewPane extends ViewPane { } this._terminalGroupService.updateVisibility(); })); + this._register(this._terminalService.onDidChangeConnectionState(() => this._initializeTerminal())); this.layoutBody(this._parentDomElement.offsetHeight, this._parentDomElement.offsetWidth); } From 9805c4b429f5d235a531b41e1be940afbbc85b45 Mon Sep 17 00:00:00 2001 From: Isidor Nikolic Date: Tue, 1 Nov 2022 17:42:46 +0100 Subject: [PATCH 014/185] a11y issues to Megan (#165166) --- .github/classifier.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/classifier.json b/.github/classifier.json index ca0e4f86467..0bc105f9388 100644 --- a/.github/classifier.json +++ b/.github/classifier.json @@ -7,7 +7,7 @@ "labels": { "L10N": {"assign": ["TylerLeonhardt", "csigs"]}, "VIM": {"assign": []}, - "accessibility": { "assign": ["isidorn"]}, + "accessibility": { "assign": ["meganrogge"]}, "api": {"assign": ["jrieken"]}, "api-finalization": {"assign": []}, "api-proposal": {"assign": ["jrieken"]}, From 739175dc74400f33b38db515e9875c66d9470a29 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Tue, 1 Nov 2022 09:43:01 -0700 Subject: [PATCH 015/185] More unused exports (#165167) For #164939 --- src/vs/workbench/api/node/extHostDebugService.ts | 2 +- src/vs/workbench/api/test/node/extHostSearch.test.ts | 2 +- src/vs/workbench/contrib/debug/common/debug.ts | 1 - .../notebook/browser/contrib/find/notebookFindWidget.ts | 2 +- .../notebook/common/notebookExecutionStateService.ts | 8 -------- src/vs/workbench/contrib/webview/browser/webview.ts | 5 ----- 6 files changed, 3 insertions(+), 17 deletions(-) diff --git a/src/vs/workbench/api/node/extHostDebugService.ts b/src/vs/workbench/api/node/extHostDebugService.ts index f8d52778b0a..55cd060d364 100644 --- a/src/vs/workbench/api/node/extHostDebugService.ts +++ b/src/vs/workbench/api/node/extHostDebugService.ts @@ -156,7 +156,7 @@ export class ExtHostDebugService extends ExtHostDebugServiceBase { let externalTerminalService: IExternalTerminalService | undefined = undefined; -export function runInExternalTerminal(args: DebugProtocol.RunInTerminalRequestArguments, configProvider: ExtHostConfigProvider): Promise { +function runInExternalTerminal(args: DebugProtocol.RunInTerminalRequestArguments, configProvider: ExtHostConfigProvider): Promise { if (!externalTerminalService) { if (platform.isWindows) { externalTerminalService = new WindowsExternalTerminalService(); diff --git a/src/vs/workbench/api/test/node/extHostSearch.test.ts b/src/vs/workbench/api/test/node/extHostSearch.test.ts index 4a692128824..3ed96b49e9d 100644 --- a/src/vs/workbench/api/test/node/extHostSearch.test.ts +++ b/src/vs/workbench/api/test/node/extHostSearch.test.ts @@ -63,7 +63,7 @@ class MockMainThreadSearch implements MainThreadSearchShape { let mockPFS: Partial; -export function extensionResultIsMatch(data: vscode.TextSearchResult): data is vscode.TextSearchMatch { +function extensionResultIsMatch(data: vscode.TextSearchResult): data is vscode.TextSearchMatch { return !!(data).preview; } diff --git a/src/vs/workbench/contrib/debug/common/debug.ts b/src/vs/workbench/contrib/debug/common/debug.ts index 36e8f9b59c0..8698a9c0f28 100644 --- a/src/vs/workbench/contrib/debug/common/debug.ts +++ b/src/vs/workbench/contrib/debug/common/debug.ts @@ -61,7 +61,6 @@ export const CONTEXT_CALLSTACK_SESSION_HAS_ONE_THREAD = new RawContextKey('watchItemType', undefined, { type: 'string', description: nls.localize('watchItemType', "Represents the item type of the focused element in the WATCH view. For example: 'expression', 'variable'") }); export const CONTEXT_CAN_VIEW_MEMORY = new RawContextKey('canViewMemory', undefined, { type: 'boolean', description: nls.localize('canViewMemory', "Indicates whether the item in the view has an associated memory refrence.") }); export const CONTEXT_BREAKPOINT_ITEM_TYPE = new RawContextKey('breakpointItemType', undefined, { type: 'string', description: nls.localize('breakpointItemType', "Represents the item type of the focused element in the BREAKPOINTS view. For example: 'breakpoint', 'exceptionBreakppint', 'functionBreakpoint', 'dataBreakpoint'") }); -export const CONTEXT_BREAKPOINT_ACCESS_TYPE = new RawContextKey('breakpointAccessType', undefined, { type: 'string', description: nls.localize('breakpointAccessType', "Represents the access type of the focused data breakpoint in the BREAKPOINTS view. For example: 'read', 'readWrite', 'write'") }); export const CONTEXT_BREAKPOINT_SUPPORTS_CONDITION = new RawContextKey('breakpointSupportsCondition', false, { type: 'boolean', description: nls.localize('breakpointSupportsCondition', "True when the focused breakpoint supports conditions.") }); export const CONTEXT_LOADED_SCRIPTS_SUPPORTED = new RawContextKey('loadedScriptsSupported', false, { type: 'boolean', description: nls.localize('loadedScriptsSupported', "True when the focused sessions supports the LOADED SCRIPTS view") }); export const CONTEXT_LOADED_SCRIPTS_ITEM_TYPE = new RawContextKey('loadedScriptsItemType', undefined, { type: 'string', description: nls.localize('loadedScriptsItemType', "Represents the item type of the focused element in the LOADED SCRIPTS view.") }); diff --git a/src/vs/workbench/contrib/notebook/browser/contrib/find/notebookFindWidget.ts b/src/vs/workbench/contrib/notebook/browser/contrib/find/notebookFindWidget.ts index 1dee3fa7ffb..ccb6b352460 100644 --- a/src/vs/workbench/contrib/notebook/browser/contrib/find/notebookFindWidget.ts +++ b/src/vs/workbench/contrib/notebook/browser/contrib/find/notebookFindWidget.ts @@ -70,7 +70,7 @@ export class NotebookFindContrib extends Disposable implements INotebookEditorCo } } -export class NotebookFindWidget extends SimpleFindReplaceWidget implements INotebookEditorContribution { +class NotebookFindWidget extends SimpleFindReplaceWidget implements INotebookEditorContribution { protected _findWidgetFocused: IContextKey; private _showTimeout: number | null = null; private _hideTimeout: number | null = null; diff --git a/src/vs/workbench/contrib/notebook/common/notebookExecutionStateService.ts b/src/vs/workbench/contrib/notebook/common/notebookExecutionStateService.ts index 19660330113..5d6e2b5134e 100644 --- a/src/vs/workbench/contrib/notebook/common/notebookExecutionStateService.ts +++ b/src/vs/workbench/contrib/notebook/common/notebookExecutionStateService.ts @@ -25,14 +25,6 @@ export interface ICellExecutionComplete { lastRunSuccess?: boolean; } -export interface ICellExecutionEntry { - notebook: URI; - cellHandle: number; - state: NotebookCellExecutionState; - didPause: boolean; - isPaused: boolean; -} - export interface ICellExecutionStateChangedEvent { notebook: URI; cellHandle: number; diff --git a/src/vs/workbench/contrib/webview/browser/webview.ts b/src/vs/workbench/contrib/webview/browser/webview.ts index 89dd1c68c12..b57628ca9c3 100644 --- a/src/vs/workbench/contrib/webview/browser/webview.ts +++ b/src/vs/workbench/contrib/webview/browser/webview.ts @@ -163,11 +163,6 @@ export interface WebviewExtensionDescription { readonly id: ExtensionIdentifier; } -export interface IDataLinkClickEvent { - readonly dataURL: string; - readonly downloadName?: string; -} - export interface WebviewMessageReceivedEvent { readonly message: any; readonly transfer?: readonly ArrayBuffer[]; From fe689beb756cd5cfd60b4fcf59cb140d56751e52 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Tue, 1 Nov 2022 09:54:56 -0700 Subject: [PATCH 016/185] Clean up some unused exports (#165107) For #164937 --- src/vs/workbench/contrib/debug/browser/baseDebugView.ts | 3 +-- src/vs/workbench/contrib/debug/browser/breakpointWidget.ts | 2 +- src/vs/workbench/contrib/debug/browser/variablesView.ts | 2 +- .../workbench/contrib/debug/browser/watchExpressionsView.ts | 2 +- src/vs/workbench/contrib/debug/common/debug.ts | 5 ++--- 5 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/vs/workbench/contrib/debug/browser/baseDebugView.ts b/src/vs/workbench/contrib/debug/browser/baseDebugView.ts index cc2159aebd0..917921fc5c7 100644 --- a/src/vs/workbench/contrib/debug/browser/baseDebugView.ts +++ b/src/vs/workbench/contrib/debug/browser/baseDebugView.ts @@ -23,8 +23,7 @@ import { IDebugService, IExpression, IExpressionContainer } from 'vs/workbench/c import { Expression, ExpressionContainer, Variable } from 'vs/workbench/contrib/debug/common/debugModel'; import { ReplEvaluationResult } from 'vs/workbench/contrib/debug/common/replModel'; -export const MAX_VALUE_RENDER_LENGTH_IN_VIEWLET = 1024; -export const twistiePixels = 20; +const MAX_VALUE_RENDER_LENGTH_IN_VIEWLET = 1024; const booleanRegex = /^(true|false)$/i; const stringRegex = /^(['"]).*\1$/; const $ = dom.$; diff --git a/src/vs/workbench/contrib/debug/browser/breakpointWidget.ts b/src/vs/workbench/contrib/debug/browser/breakpointWidget.ts index fb873a5fc69..eb3dc8780b0 100644 --- a/src/vs/workbench/contrib/debug/browser/breakpointWidget.ts +++ b/src/vs/workbench/contrib/debug/browser/breakpointWidget.ts @@ -42,7 +42,7 @@ import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeat const $ = dom.$; const IPrivateBreakpointWidgetService = createDecorator('privateBreakpointWidgetService'); -export interface IPrivateBreakpointWidgetService { +interface IPrivateBreakpointWidgetService { readonly _serviceBrand: undefined; close(success: boolean): void; } diff --git a/src/vs/workbench/contrib/debug/browser/variablesView.ts b/src/vs/workbench/contrib/debug/browser/variablesView.ts index 965282e66ce..15ee525c464 100644 --- a/src/vs/workbench/contrib/debug/browser/variablesView.ts +++ b/src/vs/workbench/contrib/debug/browser/variablesView.ts @@ -295,7 +295,7 @@ function isStackFrame(obj: any): obj is IStackFrame { return obj instanceof StackFrame; } -export class VariablesDataSource implements IAsyncDataSource { +class VariablesDataSource implements IAsyncDataSource { hasChildren(element: IStackFrame | null | IExpression | IScope): boolean { if (!element) { diff --git a/src/vs/workbench/contrib/debug/browser/watchExpressionsView.ts b/src/vs/workbench/contrib/debug/browser/watchExpressionsView.ts index 3c1669fdece..702eadc54e1 100644 --- a/src/vs/workbench/contrib/debug/browser/watchExpressionsView.ts +++ b/src/vs/workbench/contrib/debug/browser/watchExpressionsView.ts @@ -263,7 +263,7 @@ class WatchExpressionsDataSource implements IAsyncDataSource('debugType', undefined, { type: 'string', description: nls.localize('debugType', "Debug type of the active debug session. For example 'python'.") }); export const CONTEXT_DEBUG_CONFIGURATION_TYPE = new RawContextKey('debugConfigurationType', undefined, { type: 'string', description: nls.localize('debugConfigurationType', "Debug type of the selected launch configuration. For example 'python'.") }); export const CONTEXT_DEBUG_STATE = new RawContextKey('debugState', 'inactive', { type: 'string', description: nls.localize('debugState', "State that the focused debug session is in. One of the following: 'inactive', 'initializing', 'stopped' or 'running'.") }); @@ -663,7 +662,7 @@ export interface IGlobalConfig { configurations: IConfig[]; } -export interface IEnvConfig { +interface IEnvConfig { internalConsoleOptions?: 'neverOpen' | 'openOnSessionStart' | 'openOnFirstSessionStart'; preRestartTask?: string | ITaskIdentifier; postRestartTask?: string | ITaskIdentifier; @@ -937,7 +936,7 @@ export interface ILaunch { // Debug service interfaces -export const IDebugService = createDecorator(DEBUG_SERVICE_ID); +export const IDebugService = createDecorator('debugService'); export interface IDebugService { readonly _serviceBrand: undefined; From 5ab18068041a148195b124a0ec03aa1e0a273d24 Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Tue, 1 Nov 2022 18:28:53 +0100 Subject: [PATCH 017/185] Fix tree data provider being accessed after disposed (#165087) * Fix tree data provider being accessed after disposed Fixes microsoft/vscode-pull-request-github#4002 * Use setTimeout0 --- .../api/browser/mainThreadTreeViews.ts | 7 +++++++ .../workbench/api/common/extHost.protocol.ts | 1 + .../workbench/api/common/extHostTreeViews.ts | 1 + .../workbench/browser/parts/views/treeView.ts | 18 ++++++++++++++++-- 4 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/api/browser/mainThreadTreeViews.ts b/src/vs/workbench/api/browser/mainThreadTreeViews.ts index 4fcd4b8c103..a83367c01dc 100644 --- a/src/vs/workbench/api/browser/mainThreadTreeViews.ts +++ b/src/vs/workbench/api/browser/mainThreadTreeViews.ts @@ -125,6 +125,13 @@ export class MainThreadTreeViews extends Disposable implements MainThreadTreeVie return controller.resolveDropFileData(requestId, dataItemId); } + public async $disposeTree(treeViewId: string): Promise { + const viewer = this.getTreeView(treeViewId); + if (viewer) { + viewer.dataProvider = undefined; + } + } + private async reveal(treeView: ITreeView, dataProvider: TreeViewDataProvider, itemIn: ITreeItem, parentChain: ITreeItem[], options: IRevealOptions): Promise { options = options ? options : { select: false, focus: false }; const select = isUndefinedOrNull(options.select) ? false : options.select; diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index f7639db99af..8b6a77a6e78 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -266,6 +266,7 @@ export interface MainThreadTreeViewsShape extends IDisposable { $setTitle(treeViewId: string, title: string, description: string | undefined): void; $setBadge(treeViewId: string, badge: IViewBadge | undefined): void; $resolveDropFileData(destinationViewId: string, requestId: number, dataItemId: string): Promise; + $disposeTree(treeViewId: string): Promise; } export interface MainThreadDownloadServiceShape extends IDisposable { diff --git a/src/vs/workbench/api/common/extHostTreeViews.ts b/src/vs/workbench/api/common/extHostTreeViews.ts index 6650025a660..3d3360a8853 100644 --- a/src/vs/workbench/api/common/extHostTreeViews.ts +++ b/src/vs/workbench/api/common/extHostTreeViews.ts @@ -957,5 +957,6 @@ class ExtHostTreeView extends Disposable { this._refreshCancellationSource.dispose(); this.clearAll(); + this.proxy.$disposeTree(this.viewId); } } diff --git a/src/vs/workbench/browser/parts/views/treeView.ts b/src/vs/workbench/browser/parts/views/treeView.ts index 5e7aefbe08c..aca25ef5521 100644 --- a/src/vs/workbench/browser/parts/views/treeView.ts +++ b/src/vs/workbench/browser/parts/views/treeView.ts @@ -67,6 +67,7 @@ import { ITreeViewsService } from 'vs/workbench/services/views/browser/treeViews import { CodeDataTransfers } from 'vs/platform/dnd/browser/dnd'; import { addExternalEditorsDropData, toVSDataTransfer } from 'vs/editor/browser/dnd'; import { CheckboxStateHandler, TreeItemCheckbox } from 'vs/workbench/browser/parts/views/checkbox'; +import { setTimeout0 } from 'vs/base/common/platform'; export class TreeViewPane extends ViewPane { @@ -534,6 +535,10 @@ abstract class AbstractTreeView extends Disposable implements ITreeView { } setVisibility(isVisible: boolean): void { + // Throughout setVisibility we need to check if the tree view's data provider still exists. + // This can happen because the `getChildren` call to the extension can return + // after the tree has been disposed. + this.initialize(); isVisible = !!isVisible; if (this.isVisible === isVisible) { @@ -549,13 +554,17 @@ abstract class AbstractTreeView extends Disposable implements ITreeView { DOM.hide(this.tree.getHTMLElement()); // make sure the tree goes out of the tabindex world by hiding it } - if (this.isVisible && this.elementsToRefresh.length) { + if (this.isVisible && this.elementsToRefresh.length && this.dataProvider) { this.doRefresh(this.elementsToRefresh); this.elementsToRefresh = []; } } - this._onDidChangeVisibility.fire(this.isVisible); + setTimeout0(() => { + if (this.dataProvider) { + this._onDidChangeVisibility.fire(this.isVisible); + } + }); if (this.visible) { this.activate(); @@ -1439,6 +1448,11 @@ class TreeMenus extends Disposable implements IDisposable { } return result; } + + override dispose() { + this.contextKeyService = undefined; + super.dispose(); + } } export class CustomTreeView extends AbstractTreeView { From 35a0299ff6142031af6fb4dacd74fd2969408db9 Mon Sep 17 00:00:00 2001 From: SteVen Batten <6561887+sbatten@users.noreply.github.com> Date: Tue, 1 Nov 2022 10:48:15 -0700 Subject: [PATCH 018/185] use ctxt menu event for all actBar context menus (#165177) fixes #163247 --- .../parts/activitybar/activitybarActions.ts | 39 ++++++++++--------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts b/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts index ce2a3e8fe51..2fff6cff0b4 100644 --- a/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts +++ b/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts @@ -5,7 +5,7 @@ import 'vs/css!./media/activityaction'; import { localize } from 'vs/nls'; -import { EventType, addDisposableListener, EventHelper, getDomNodePagePosition } from 'vs/base/browser/dom'; +import { EventType, addDisposableListener, EventHelper } from 'vs/base/browser/dom'; import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { EventType as TouchEventType, GestureEvent } from 'vs/base/browser/touch'; import { Action, IAction, Separator, SubmenuAction, toAction } from 'vs/base/common/actions'; @@ -38,6 +38,7 @@ import { ViewContainerLocation } from 'vs/workbench/common/views'; import { IPaneCompositePart } from 'vs/workbench/browser/parts/paneCompositePart'; import { ICredentialsService } from 'vs/platform/credentials/common/credentials'; import { IUserDataProfileService, ManageProfilesSubMenu, PROFILES_CATEGORY } from 'vs/workbench/services/userDataProfile/common/userDataProfile'; +import { StandardMouseEvent } from 'vs/base/browser/mouseEvent'; export class ViewContainerActivityAction extends ActivityAction { @@ -131,33 +132,33 @@ abstract class AbstractGlobalActivityActionViewItem extends ActivityActionViewIt override render(container: HTMLElement): void { super.render(container); - // Context menus are triggered on mouse down so that an item can be picked - // and executed with releasing the mouse over it - this._register(addDisposableListener(this.container, EventType.MOUSE_DOWN, async (e: MouseEvent) => { EventHelper.stop(e, true); const isLeftClick = e?.button !== 2; // Left-click run if (isLeftClick) { this.run(); - } else { - const disposables = new DisposableStore(); - const actions = await this.resolveContextMenuActions(disposables); - - const elementPosition = getDomNodePagePosition(this.container); - const anchor = { - x: Math.floor(elementPosition.left + (elementPosition.width / 2)), - y: elementPosition.top + elementPosition.height - }; - - this.contextMenuService.showContextMenu({ - getAnchor: () => anchor, - getActions: () => actions, - onHide: () => disposables.dispose() - }); } })); + // The rest of the activity bar uses context menu event for the context menu, so we match this + this._register(addDisposableListener(this.container, EventType.CONTEXT_MENU, async (e: MouseEvent) => { + const disposables = new DisposableStore(); + const actions = await this.resolveContextMenuActions(disposables); + + const event = new StandardMouseEvent(e); + const anchor = { + x: event.posx, + y: event.posy + }; + + this.contextMenuService.showContextMenu({ + getAnchor: () => anchor, + getActions: () => actions, + onHide: () => disposables.dispose() + }); + })); + this._register(addDisposableListener(this.container, EventType.KEY_UP, (e: KeyboardEvent) => { const event = new StandardKeyboardEvent(e); if (event.equals(KeyCode.Enter) || event.equals(KeyCode.Space)) { From d126b9f53a93c865bba056390131b927c2cccb31 Mon Sep 17 00:00:00 2001 From: Andre Weinand Date: Tue, 1 Nov 2022 18:57:05 +0100 Subject: [PATCH 019/185] Remove a few `export`s (#165158) * Remove a few `export`s * don't omit indirect exports --- src/vs/platform/debug/common/extensionHostDebug.ts | 7 ------- src/vs/workbench/contrib/debug/common/debug.ts | 6 +----- .../configurationResolver/common/configurationResolver.ts | 6 +++--- .../configurationResolver/common/variableResolver.ts | 2 +- 4 files changed, 5 insertions(+), 16 deletions(-) diff --git a/src/vs/platform/debug/common/extensionHostDebug.ts b/src/vs/platform/debug/common/extensionHostDebug.ts index 3176cf851ed..a519f90d282 100644 --- a/src/vs/platform/debug/common/extensionHostDebug.ts +++ b/src/vs/platform/debug/common/extensionHostDebug.ts @@ -32,13 +32,6 @@ export interface IOpenExtensionWindowResult { success: boolean; } -/** - * Like a IProcessEnvironment, but the value "null" deletes an environment variable - */ -export interface INullableProcessEnvironment { - [key: string]: string | null; -} - export interface IExtensionHostDebugService { readonly _serviceBrand: undefined; diff --git a/src/vs/workbench/contrib/debug/common/debug.ts b/src/vs/workbench/contrib/debug/common/debug.ts index 59492b52407..8f2ac433fb4 100644 --- a/src/vs/workbench/contrib/debug/common/debug.ts +++ b/src/vs/workbench/contrib/debug/common/debug.ts @@ -820,11 +820,7 @@ export interface IDebugAdapterDescriptorFactory { createDebugAdapterDescriptor(session: IDebugSession): Promise; } -export interface IDebugAdapterTrackerFactory { - readonly type: string; -} - -export interface ITerminalLauncher { +interface ITerminalLauncher { runInTerminal(args: DebugProtocol.RunInTerminalRequestArguments, sessionId: string): Promise; } diff --git a/src/vs/workbench/services/configurationResolver/common/configurationResolver.ts b/src/vs/workbench/services/configurationResolver/common/configurationResolver.ts index f8bf1cb3eca..135ff269e94 100644 --- a/src/vs/workbench/services/configurationResolver/common/configurationResolver.ts +++ b/src/vs/workbench/services/configurationResolver/common/configurationResolver.ts @@ -55,7 +55,7 @@ export interface IConfigurationResolverService { contributeVariable(variable: string, resolution: () => Promise): void; } -export interface PromptStringInputInfo { +interface PromptStringInputInfo { id: string; type: 'promptString'; description: string; @@ -63,7 +63,7 @@ export interface PromptStringInputInfo { password?: boolean; } -export interface PickStringInputInfo { +interface PickStringInputInfo { id: string; type: 'pickString'; description: string; @@ -71,7 +71,7 @@ export interface PickStringInputInfo { default?: string; } -export interface CommandInputInfo { +interface CommandInputInfo { id: string; type: 'command'; command: string; diff --git a/src/vs/workbench/services/configurationResolver/common/variableResolver.ts b/src/vs/workbench/services/configurationResolver/common/variableResolver.ts index 5b512c36a6a..1da1b0334df 100644 --- a/src/vs/workbench/services/configurationResolver/common/variableResolver.ts +++ b/src/vs/workbench/services/configurationResolver/common/variableResolver.ts @@ -17,7 +17,7 @@ import { IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; import { ILabelService } from 'vs/platform/label/common/label'; import { replaceAsync } from 'vs/base/common/strings'; -export interface IVariableResolveContext { +interface IVariableResolveContext { getFolderUri(folderName: string): uri | undefined; getWorkspaceFolderCount(): number; getConfigurationValue(folderUri: uri | undefined, section: string): string | undefined; From fa2be83ef0fa98833c6dfd8e91d666253716528f Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Tue, 1 Nov 2022 19:02:24 +0100 Subject: [PATCH 020/185] Remove unneeded `export` (#165178) Part of #164933 --- src/vs/workbench/api/common/extHostComments.ts | 2 +- src/vs/workbench/api/node/extHostTunnelService.ts | 2 +- .../workbench/contrib/comments/browser/commentService.ts | 2 +- .../contrib/comments/browser/commentThreadZoneWidget.ts | 2 +- .../contrib/comments/browser/commentsTreeViewer.ts | 4 ++-- .../contrib/comments/browser/commentsViewActions.ts | 2 +- .../workbench/contrib/remote/browser/explorerViewItems.ts | 2 +- src/vs/workbench/contrib/remote/browser/remote.ts | 4 ++-- src/vs/workbench/contrib/remote/browser/tunnelView.ts | 8 ++++---- 9 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/vs/workbench/api/common/extHostComments.ts b/src/vs/workbench/api/common/extHostComments.ts index 0c757e5ccdd..e66c60290f9 100644 --- a/src/vs/workbench/api/common/extHostComments.ts +++ b/src/vs/workbench/api/common/extHostComments.ts @@ -23,7 +23,7 @@ import { ExtHostCommands } from './extHostCommands'; type ProviderHandle = number; -export interface ExtHostComments { +interface ExtHostComments { createCommentController(extension: IExtensionDescription, id: string, label: string): vscode.CommentController; } diff --git a/src/vs/workbench/api/node/extHostTunnelService.ts b/src/vs/workbench/api/node/extHostTunnelService.ts index d7abe11a16d..2df2828d9ad 100644 --- a/src/vs/workbench/api/node/extHostTunnelService.ts +++ b/src/vs/workbench/api/node/extHostTunnelService.ts @@ -61,7 +61,7 @@ export function loadListeningPorts(...stdouts: string[]): { socket: number; ip: ]; } -export function parseIpAddress(hex: string): string { +function parseIpAddress(hex: string): string { let result = ''; if (hex.length === 8) { for (let i = hex.length - 2; i >= 0; i -= 2) { diff --git a/src/vs/workbench/contrib/comments/browser/commentService.ts b/src/vs/workbench/contrib/comments/browser/commentService.ts index 4efc5d1a825..454ac5f6408 100644 --- a/src/vs/workbench/contrib/comments/browser/commentService.ts +++ b/src/vs/workbench/contrib/comments/browser/commentService.ts @@ -17,7 +17,7 @@ import { IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/la export const ICommentService = createDecorator('commentService'); -export interface IResourceCommentThreadEvent { +interface IResourceCommentThreadEvent { resource: URI; commentInfos: ICommentInfo[]; } diff --git a/src/vs/workbench/contrib/comments/browser/commentThreadZoneWidget.ts b/src/vs/workbench/contrib/comments/browser/commentThreadZoneWidget.ts index a55d509800c..fd493a46441 100644 --- a/src/vs/workbench/contrib/comments/browser/commentThreadZoneWidget.ts +++ b/src/vs/workbench/contrib/comments/browser/commentThreadZoneWidget.ts @@ -26,7 +26,7 @@ import { ICellRange } from 'vs/workbench/contrib/notebook/common/notebookRange'; import { commentThreadStateBackgroundColorVar, commentThreadStateColorVar, getCommentThreadStateColor } from 'vs/workbench/contrib/comments/browser/commentColors'; import { peekViewBorder } from 'vs/editor/contrib/peekView/browser/peekView'; -export function getCommentThreadWidgetStateColor(thread: languages.CommentThreadState | undefined, theme: IColorTheme): Color | undefined { +function getCommentThreadWidgetStateColor(thread: languages.CommentThreadState | undefined, theme: IColorTheme): Color | undefined { return getCommentThreadStateColor(thread, theme) ?? theme.getColor(peekViewBorder); } diff --git a/src/vs/workbench/contrib/comments/browser/commentsTreeViewer.ts b/src/vs/workbench/contrib/comments/browser/commentsTreeViewer.ts index c03920630e1..a6222c2da72 100644 --- a/src/vs/workbench/contrib/comments/browser/commentsTreeViewer.ts +++ b/src/vs/workbench/contrib/comments/browser/commentsTreeViewer.ts @@ -73,7 +73,7 @@ interface ICommentThreadTemplateData { disposables: IDisposable[]; } -export class CommentsModelVirualDelegate implements IListVirtualDelegate { +class CommentsModelVirualDelegate implements IListVirtualDelegate { private static readonly RESOURCE_ID = 'resource-with-comments'; private static readonly COMMENT_ID = 'comment-node'; @@ -269,7 +269,7 @@ interface CommentFilterData { textMatches: IMatch[]; } -export type FilterData = ResourceFilterData | CommentFilterData; +type FilterData = ResourceFilterData | CommentFilterData; export class Filter implements ITreeFilter { diff --git a/src/vs/workbench/contrib/comments/browser/commentsViewActions.ts b/src/vs/workbench/contrib/comments/browser/commentsViewActions.ts index 7720d37c9e3..e6fd43f4b91 100644 --- a/src/vs/workbench/contrib/comments/browser/commentsViewActions.ts +++ b/src/vs/workbench/contrib/comments/browser/commentsViewActions.ts @@ -25,7 +25,7 @@ export interface CommentsFiltersChangeEvent { showUnresolved?: boolean; } -export interface CommentsFiltersOptions { +interface CommentsFiltersOptions { showResolved: boolean; showUnresolved: boolean; } diff --git a/src/vs/workbench/contrib/remote/browser/explorerViewItems.ts b/src/vs/workbench/contrib/remote/browser/explorerViewItems.ts index 5bc415b7516..aa8ed9355e7 100644 --- a/src/vs/workbench/contrib/remote/browser/explorerViewItems.ts +++ b/src/vs/workbench/contrib/remote/browser/explorerViewItems.ts @@ -20,7 +20,7 @@ import { Action2, MenuId } from 'vs/platform/actions/common/actions'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { VIEWLET_ID } from 'vs/workbench/contrib/remote/browser/remoteExplorer'; -export interface IRemoteSelectItem extends ISelectOptionItem { +interface IRemoteSelectItem extends ISelectOptionItem { authority: string[]; } diff --git a/src/vs/workbench/contrib/remote/browser/remote.ts b/src/vs/workbench/contrib/remote/browser/remote.ts index c8aa533f654..325f5e35b6c 100644 --- a/src/vs/workbench/contrib/remote/browser/remote.ts +++ b/src/vs/workbench/contrib/remote/browser/remote.ts @@ -53,7 +53,7 @@ import { ITimerService } from 'vs/workbench/services/timer/browser/timerService' import { getRemoteName } from 'vs/platform/remote/common/remoteHosts'; import { IActionViewItem } from 'vs/base/browser/ui/actionbar/actionbar'; -export interface HelpInformation { +interface HelpInformation { extensionDescription: IExtensionDescription; getStarted?: string; documentation?: string; @@ -457,7 +457,7 @@ class HelpPanelDescriptor implements IViewDescriptor { } } -export class RemoteViewPaneContainer extends FilterViewPaneContainer implements IViewModel { +class RemoteViewPaneContainer extends FilterViewPaneContainer implements IViewModel { private helpPanelDescriptor = new HelpPanelDescriptor(this); helpInformation: HelpInformation[] = []; private hasSetSwitchForConnection: boolean = false; diff --git a/src/vs/workbench/contrib/remote/browser/tunnelView.ts b/src/vs/workbench/contrib/remote/browser/tunnelView.ts index 4234e53009a..e01d95ec63a 100644 --- a/src/vs/workbench/contrib/remote/browser/tunnelView.ts +++ b/src/vs/workbench/contrib/remote/browser/tunnelView.ts @@ -69,7 +69,7 @@ class TunnelTreeVirtualDelegate implements ITableVirtualDelegate { } } -export interface ITunnelViewModel { +interface ITunnelViewModel { readonly onForwardedPortsChanged: Event; readonly all: TunnelItem[]; readonly input: TunnelItem; @@ -728,8 +728,8 @@ class TunnelItem implements ITunnelItem { } } -export const TunnelTypeContextKey = new RawContextKey('tunnelType', TunnelType.Add, true); -export const TunnelCloseableContextKey = new RawContextKey('tunnelCloseable', false, true); +const TunnelTypeContextKey = new RawContextKey('tunnelType', TunnelType.Add, true); +const TunnelCloseableContextKey = new RawContextKey('tunnelCloseable', false, true); const TunnelPrivacyContextKey = new RawContextKey('tunnelPrivacy', undefined, true); const TunnelPrivacyEnabledContextKey = new RawContextKey('tunnelPrivacyEnabled', false, true); const TunnelProtocolContextKey = new RawContextKey('tunnelProtocol', TunnelProtocol.Http, true); @@ -1778,7 +1778,7 @@ MenuRegistry.appendMenuItem(MenuId.TunnelLocalAddressInline, ({ isForwardedOrDetectedExpr) })); -export const portWithRunningProcessForeground = registerColor('ports.iconRunningProcessForeground', { +const portWithRunningProcessForeground = registerColor('ports.iconRunningProcessForeground', { light: STATUS_BAR_HOST_NAME_BACKGROUND, dark: STATUS_BAR_HOST_NAME_BACKGROUND, hcDark: STATUS_BAR_HOST_NAME_BACKGROUND, From d5d392b03d20e2b085b9ac654ce51a1abd53ce36 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 1 Nov 2022 11:41:34 -0700 Subject: [PATCH 021/185] Use `_` for privates in webview code (#165183) --- .../contrib/webview/browser/overlayWebview.ts | 18 +-- .../contrib/webview/browser/themeing.ts | 6 +- .../contrib/webview/browser/webview.ts | 24 ++-- .../contrib/webview/browser/webviewElement.ts | 134 +++++++++--------- .../contrib/webview/browser/webviewService.ts | 6 +- .../electron-sandbox/webviewElement.ts | 10 +- .../windowIgnoreMenuShortcutsManager.ts | 12 +- 7 files changed, 105 insertions(+), 105 deletions(-) diff --git a/src/vs/workbench/contrib/webview/browser/overlayWebview.ts b/src/vs/workbench/contrib/webview/browser/overlayWebview.ts index 1c9088e1424..7bc380d9818 100644 --- a/src/vs/workbench/contrib/webview/browser/overlayWebview.ts +++ b/src/vs/workbench/contrib/webview/browser/overlayWebview.ts @@ -117,7 +117,7 @@ export class OverlayWebview extends Disposable implements IOverlayWebview { const oldOwner = this._owner; this._owner = owner; - this.show(); + this._show(); if (oldOwner !== owner) { const contextKeyService = (scopedContextKeyService || this._baseContextKeyService); @@ -184,7 +184,7 @@ export class OverlayWebview extends Disposable implements IOverlayWebview { } } - private show() { + private _show() { if (this._isDisposed) { throw new Error('Webview overlay is disposed'); } @@ -259,25 +259,25 @@ export class OverlayWebview extends Disposable implements IOverlayWebview { public get html(): string { return this._html; } public set html(value: string) { this._html = value; - this.withWebview(webview => webview.html = value); + this._withWebview(webview => webview.html = value); } public get initialScrollProgress(): number { return this._initialScrollProgress; } public set initialScrollProgress(value: number) { this._initialScrollProgress = value; - this.withWebview(webview => webview.initialScrollProgress = value); + this._withWebview(webview => webview.initialScrollProgress = value); } public get state(): string | undefined { return this._state; } public set state(value: string | undefined) { this._state = value; - this.withWebview(webview => webview.state = value); + this._withWebview(webview => webview.state = value); } public get extension(): WebviewExtensionDescription | undefined { return this._extension; } public set extension(value: WebviewExtensionDescription | undefined) { this._extension = value; - this.withWebview(webview => webview.extension = value); + this._withWebview(webview => webview.extension = value); } public get options(): WebviewOptions { return this._options; } @@ -286,11 +286,11 @@ export class OverlayWebview extends Disposable implements IOverlayWebview { public get contentOptions(): WebviewContentOptions { return this._contentOptions; } public set contentOptions(value: WebviewContentOptions) { this._contentOptions = value; - this.withWebview(webview => webview.contentOptions = value); + this._withWebview(webview => webview.contentOptions = value); } public set localResourcesRoot(resources: URI[]) { - this.withWebview(webview => webview.localResourcesRoot = resources); + this._withWebview(webview => webview.localResourcesRoot = resources); } private readonly _onDidFocus = this._register(new Emitter()); @@ -355,7 +355,7 @@ export class OverlayWebview extends Disposable implements IOverlayWebview { runFindAction(previous: boolean): void { this._webview.value?.runFindAction(previous); } - private withWebview(f: (webview: IWebview) => void): void { + private _withWebview(f: (webview: IWebview) => void): void { if (this._webview.value) { f(this._webview.value); } diff --git a/src/vs/workbench/contrib/webview/browser/themeing.ts b/src/vs/workbench/contrib/webview/browser/themeing.ts index 12a4c8effd1..4fd074d18ae 100644 --- a/src/vs/workbench/contrib/webview/browser/themeing.ts +++ b/src/vs/workbench/contrib/webview/browser/themeing.ts @@ -34,13 +34,13 @@ export class WebviewThemeDataProvider extends Disposable { super(); this._register(this._themeService.onDidColorThemeChange(() => { - this.reset(); + this._reset(); })); const webviewConfigurationKeys = ['editor.fontFamily', 'editor.fontWeight', 'editor.fontSize']; this._register(this._configurationService.onDidChangeConfiguration(e => { if (webviewConfigurationKeys.some(key => e.affectsConfiguration(key))) { - this.reset(); + this._reset(); } })); } @@ -82,7 +82,7 @@ export class WebviewThemeDataProvider extends Disposable { return this._cachedWebViewThemeData; } - private reset() { + private _reset() { this._cachedWebViewThemeData = undefined; this._onThemeDataChanged.fire(); } diff --git a/src/vs/workbench/contrib/webview/browser/webview.ts b/src/vs/workbench/contrib/webview/browser/webview.ts index b57628ca9c3..6866db114f8 100644 --- a/src/vs/workbench/contrib/webview/browser/webview.ts +++ b/src/vs/workbench/contrib/webview/browser/webview.ts @@ -299,32 +299,32 @@ export interface IOverlayWebview extends IWebview { */ export class WebviewOriginStore { - private readonly memento: Memento; - private readonly state: MementoObject; + private readonly _memento: Memento; + private readonly _state: MementoObject; constructor( rootStorageKey: string, @IStorageService storageService: IStorageService, ) { - this.memento = new Memento(rootStorageKey, storageService); - this.state = this.memento.getMemento(StorageScope.APPLICATION, StorageTarget.MACHINE); + this._memento = new Memento(rootStorageKey, storageService); + this._state = this._memento.getMemento(StorageScope.APPLICATION, StorageTarget.MACHINE); } public getOrigin(viewType: string, additionalKey: string | undefined): string { - const key = this.getKey(viewType, additionalKey); + const key = this._getKey(viewType, additionalKey); - const existing = this.state[key]; + const existing = this._state[key]; if (existing && typeof existing === 'string') { return existing; } const newOrigin = generateUuid(); - this.state[key] = newOrigin; - this.memento.saveMemento(); + this._state[key] = newOrigin; + this._memento.saveMemento(); return newOrigin; } - private getKey(viewType: string, additionalKey: string | undefined): string { + private _getKey(viewType: string, additionalKey: string | undefined): string { return JSON.stringify({ viewType, key: additionalKey }); } } @@ -336,16 +336,16 @@ export class WebviewOriginStore { */ export class ExtensionKeyedWebviewOriginStore { - private readonly store: WebviewOriginStore; + private readonly _store: WebviewOriginStore; constructor( rootStorageKey: string, @IStorageService storageService: IStorageService, ) { - this.store = new WebviewOriginStore(rootStorageKey, storageService); + this._store = new WebviewOriginStore(rootStorageKey, storageService); } public getOrigin(viewType: string, extId: ExtensionIdentifier): string { - return this.store.getOrigin(viewType, extId.value); + return this._store.getOrigin(viewType, extId.value); } } diff --git a/src/vs/workbench/contrib/webview/browser/webviewElement.ts b/src/vs/workbench/contrib/webview/browser/webviewElement.ts index 19a1ec39e8e..bb16d3bfd3b 100644 --- a/src/vs/workbench/contrib/webview/browser/webviewElement.ts +++ b/src/vs/workbench/contrib/webview/browser/webviewElement.ts @@ -125,10 +125,10 @@ export class WebviewElement extends Disposable implements IWebview, WebviewFindD /** * Unique internal identifier of this webview's iframe element. */ - private readonly iframeId: string; + private readonly _iframeId: string; - private readonly encodedWebviewOriginPromise: Promise; - private encodedWebviewOrigin: string | undefined; + private readonly _encodedWebviewOriginPromise: Promise; + private _encodedWebviewOrigin: string | undefined; protected get platform(): string { return 'browser'; } @@ -152,7 +152,7 @@ export class WebviewElement extends Disposable implements IWebview, WebviewFindD private _state: WebviewState.State = new WebviewState.Initializing([]); - private content: WebviewContent; + private _content: WebviewContent; private readonly _portMappingManager: WebviewPortMappingManager; @@ -167,7 +167,7 @@ export class WebviewElement extends Disposable implements IWebview, WebviewFindD private readonly _onDidHtmlChange: Emitter = this._register(new Emitter()); protected readonly onDidHtmlChange = this._onDidHtmlChange.event; - private messagePort?: MessagePort; + private _messagePort?: MessagePort; private readonly _messageHandlers = new Map void>>(); protected readonly _webviewFindWidget: WebviewFindWidget | undefined; @@ -177,7 +177,7 @@ export class WebviewElement extends Disposable implements IWebview, WebviewFindD public extension: WebviewExtensionDescription | undefined; - private readonly options: WebviewOptions; + private readonly _options: WebviewOptions; constructor( initInfo: WebviewInitInfo, @@ -199,15 +199,15 @@ export class WebviewElement extends Disposable implements IWebview, WebviewFindD this.id = initInfo.id; this.providedViewType = initInfo.providedViewType; - this.iframeId = generateUuid(); - this.origin = initInfo.origin ?? this.iframeId; + this._iframeId = generateUuid(); + this.origin = initInfo.origin ?? this._iframeId; - this.encodedWebviewOriginPromise = parentOriginHash(window.origin, this.origin).then(id => this.encodedWebviewOrigin = id); + this._encodedWebviewOriginPromise = parentOriginHash(window.origin, this.origin).then(id => this._encodedWebviewOrigin = id); - this.options = initInfo.options; + this._options = initInfo.options; this.extension = initInfo.extension; - this.content = { + this._content = { html: '', options: initInfo.contentOptions, state: undefined @@ -215,32 +215,32 @@ export class WebviewElement extends Disposable implements IWebview, WebviewFindD this._portMappingManager = this._register(new WebviewPortMappingManager( () => this.extension?.location, - () => this.content.options.portMapping || [], + () => this._content.options.portMapping || [], this._tunnelService )); - this._element = this.createElement(initInfo.options, initInfo.contentOptions); + this._element = this._createElement(initInfo.options, initInfo.contentOptions); const subscription = this._register(addDisposableListener(window, 'message', (e: MessageEvent) => { - if (!this.encodedWebviewOrigin || e?.data?.target !== this.iframeId) { + if (!this._encodedWebviewOrigin || e?.data?.target !== this._iframeId) { return; } - if (e.origin !== this.webviewContentOrigin(this.encodedWebviewOrigin)) { - console.log(`Skipped renderer receiving message due to mismatched origins: ${e.origin} ${this.webviewContentOrigin}`); + if (e.origin !== this._webviewContentOrigin(this._encodedWebviewOrigin)) { + console.log(`Skipped renderer receiving message due to mismatched origins: ${e.origin} ${this._webviewContentOrigin}`); return; } if (e.data.channel === WebviewMessageChannels.webviewReady) { - if (this.messagePort) { + if (this._messagePort) { return; } this._logService.debug(`Webview(${this.id}): webview ready`); - this.messagePort = e.ports[0]; - this.messagePort.onmessage = (e) => { + this._messagePort = e.ports[0]; + this._messagePort.onmessage = (e) => { const handlers = this._messageHandlers.get(e.data.channel); if (!handlers) { console.log(`No handlers found for '${e.data.channel}'`); @@ -381,7 +381,7 @@ export class WebviewElement extends Disposable implements IWebview, WebviewFindD })); this._register(this.on(WebviewMessageChannels.dragStart, () => { - this.startBlockingIframeDragEvents(); + this._startBlockingIframeDragEvents(); })); if (initInfo.options.enableFindWidget) { @@ -389,9 +389,9 @@ export class WebviewElement extends Disposable implements IWebview, WebviewFindD this.styledFindWidget(); } - this.encodedWebviewOriginPromise.then(encodedWebviewOrigin => { + this._encodedWebviewOriginPromise.then(encodedWebviewOrigin => { if (!this._disposed) { - this.initElement(encodedWebviewOrigin, this.extension, this.options); + this._initElement(encodedWebviewOrigin, this.extension, this._options); } }); } @@ -402,7 +402,7 @@ export class WebviewElement extends Disposable implements IWebview, WebviewFindD this.element?.remove(); this._element = undefined; - this.messagePort = undefined; + this._messagePort = undefined; if (this._state.type === WebviewState.Type.Initializing) { for (const message of this._state.pendingMessages) { @@ -456,18 +456,18 @@ export class WebviewElement extends Disposable implements IWebview, WebviewFindD return this._send('message', { message, transfer }); } - private async _send(channel: string, data?: any, transferable: Transferable[] = []): Promise { + private async _send(channel: string, data?: any, _createElement: Transferable[] = []): Promise { if (this._state.type === WebviewState.Type.Initializing) { let resolve: (x: boolean) => void; const promise = new Promise(r => resolve = r); - this._state.pendingMessages.push({ channel, data, transferable, resolve: resolve! }); + this._state.pendingMessages.push({ channel, data, transferable: _createElement, resolve: resolve! }); return promise; } else { - return this.doPostMessage(channel, data, transferable); + return this.doPostMessage(channel, data, _createElement); } } - private createElement(options: WebviewOptions, _contentOptions: WebviewContentOptions) { + private _createElement(options: WebviewOptions, _contentOptions: WebviewContentOptions) { // Do not start loading the webview yet. // Wait the end of the ctor when all listeners have been hooked up. const element = document.createElement('iframe'); @@ -487,16 +487,16 @@ export class WebviewElement extends Disposable implements IWebview, WebviewFindD element.style.height = '100%'; element.focus = () => { - this.doFocus(); + this._doFocus(); }; return element; } - private initElement(encodedWebviewOrigin: string, extension: WebviewExtensionDescription | undefined, options: WebviewOptions) { + private _initElement(encodedWebviewOrigin: string, extension: WebviewExtensionDescription | undefined, options: WebviewOptions) { // The extensionId and purpose in the URL are used for filtering in js-debug: const params: { [key: string]: string } = { - id: this.iframeId, + id: this._iframeId, origin: this.origin, swVersion: String(this._expectedServiceWorkerVersion), extensionId: extension?.id.value ?? '', @@ -523,37 +523,37 @@ export class WebviewElement extends Disposable implements IWebview, WebviewFindD this.element!.setAttribute('src', `${this.webviewContentEndpoint(encodedWebviewOrigin)}/${fileName}?${queryString}`); } - public mountTo(parent: HTMLElement) { + public mountTo(_stopBlockingIframeDragEvents: HTMLElement) { if (!this.element) { return; } if (this._webviewFindWidget) { - parent.appendChild(this._webviewFindWidget.getDomNode()); + _stopBlockingIframeDragEvents.appendChild(this._webviewFindWidget.getDomNode()); } for (const eventName of [EventType.MOUSE_DOWN, EventType.MOUSE_MOVE, EventType.DROP]) { - this._register(addDisposableListener(parent, eventName, () => { - this.stopBlockingIframeDragEvents(); + this._register(addDisposableListener(_stopBlockingIframeDragEvents, eventName, () => { + this._stopBlockingIframeDragEvents(); })); } - for (const node of [parent, window]) { + for (const node of [_stopBlockingIframeDragEvents, window]) { this._register(addDisposableListener(node, EventType.DRAG_END, () => { - this.stopBlockingIframeDragEvents(); + this._stopBlockingIframeDragEvents(); })); } - parent.appendChild(this.element); + _stopBlockingIframeDragEvents.appendChild(this.element); } - private startBlockingIframeDragEvents() { + private _startBlockingIframeDragEvents() { if (this.element) { this.element.style.pointerEvents = 'none'; } } - private stopBlockingIframeDragEvents() { + private _stopBlockingIframeDragEvents() { if (this.element) { this.element.style.pointerEvents = 'auto'; } @@ -572,14 +572,14 @@ export class WebviewElement extends Disposable implements IWebview, WebviewFindD return endpoint; } - private webviewContentOrigin(encodedWebviewOrigin: string): string { + private _webviewContentOrigin(encodedWebviewOrigin: string): string { const uri = URI.parse(this.webviewContentEndpoint(encodedWebviewOrigin)); return uri.scheme + '://' + uri.authority.toLowerCase(); } private doPostMessage(channel: string, data?: any, transferable: Transferable[] = []): boolean { - if (this.element && this.messagePort) { - this.messagePort.postMessage({ channel, args: data }, transferable); + if (this.element && this._messagePort) { + this._messagePort.postMessage({ channel, args: data }, transferable); return true; } return false; @@ -625,7 +625,7 @@ export class WebviewElement extends Disposable implements IWebview, WebviewFindD } public reload(): void { - this.doUpdateContent(this.content); + this.doUpdateContent(this._content); const subscription = this._register(this.on(WebviewMessageChannels.didLoad, () => { this._onDidReload.fire(); @@ -636,8 +636,8 @@ export class WebviewElement extends Disposable implements IWebview, WebviewFindD public set html(value: string) { this.doUpdateContent({ html: value, - options: this.content.options, - state: this.content.state, + options: this._content.options, + state: this._content.state, }); this._onDidHtmlChange.fire(value); } @@ -645,29 +645,29 @@ export class WebviewElement extends Disposable implements IWebview, WebviewFindD public set contentOptions(options: WebviewContentOptions) { this._logService.debug(`Webview(${this.id}): will update content options`); - if (areWebviewContentOptionsEqual(options, this.content.options)) { + if (areWebviewContentOptionsEqual(options, this._content.options)) { this._logService.debug(`Webview(${this.id}): skipping content options update`); return; } this.doUpdateContent({ - html: this.content.html, + html: this._content.html, options: options, - state: this.content.state, + state: this._content.state, }); } public set localResourcesRoot(resources: readonly URI[]) { - this.content = { - ...this.content, - options: { ...this.content.options, localResourceRoots: resources } + this._content = { + ...this._content, + options: { ...this._content.options, localResourceRoots: resources } }; } public set state(state: string | undefined) { - this.content = { - html: this.content.html, - options: this.content.options, + this._content = { + html: this._content.html, + options: this._content.options, state, }; } @@ -679,17 +679,17 @@ export class WebviewElement extends Disposable implements IWebview, WebviewFindD private doUpdateContent(newContent: WebviewContent) { this._logService.debug(`Webview(${this.id}): will update content`); - this.content = newContent; + this._content = newContent; - const allowScripts = !!this.content.options.allowScripts; + const allowScripts = !!this._content.options.allowScripts; this._send('content', { - contents: this.content.html, + contents: this._content.html, options: { - allowMultipleAPIAcquire: !!this.content.options.allowMultipleAPIAcquire, + allowMultipleAPIAcquire: !!this._content.options.allowMultipleAPIAcquire, allowScripts: allowScripts, - allowForms: this.content.options.allowForms ?? allowScripts, // For back compat, we allow forms by default when scripts are enabled + allowForms: this._content.options.allowForms ?? allowScripts, // For back compat, we allow forms by default when scripts are enabled }, - state: this.content.state, + state: this._content.state, cspSource: webviewGenericCspSource, confirmBeforeClose: this._confirmBeforeClose, }); @@ -697,8 +697,8 @@ export class WebviewElement extends Disposable implements IWebview, WebviewFindD protected style(): void { let { styles, activeTheme, themeLabel, themeId } = this.webviewThemeDataProvider.getWebviewThemeData(); - if (this.options.transformCssVariables) { - styles = this.options.transformCssVariables(styles); + if (this._options.transformCssVariables) { + styles = this._options.transformCssVariables(styles); } const reduceMotion = this._accessibilityService.isMotionReduced(); @@ -737,11 +737,11 @@ export class WebviewElement extends Disposable implements IWebview, WebviewFindD // Webview break drag and dropping around the main window (no events are generated when you are over them) // Work around this by disabling pointer events during the drag. // https://github.com/electron/electron/issues/18226 - this.startBlockingIframeDragEvents(); + this._startBlockingIframeDragEvents(); } windowDidDragEnd(): void { - this.stopBlockingIframeDragEvents(); + this._stopBlockingIframeDragEvents(); } public selectAll() { @@ -778,7 +778,7 @@ export class WebviewElement extends Disposable implements IWebview, WebviewFindD try { const result = await loadLocalResource(uri, { ifNoneMatch, - roots: this.content.options.localResourceRoots || [], + roots: this._content.options.localResourceRoots || [], }, this._fileService, this._logService, this._resourceLoadingCts.token); switch (result.type) { @@ -839,13 +839,13 @@ export class WebviewElement extends Disposable implements IWebview, WebviewFindD } public focus(): void { - this.doFocus(); + this._doFocus(); // Handle focus change programmatically (do not rely on event from ) this.handleFocusChange(true); } - private doFocus() { + private _doFocus() { if (!this.element) { return; } diff --git a/src/vs/workbench/contrib/webview/browser/webviewService.ts b/src/vs/workbench/contrib/webview/browser/webviewService.ts index b1e7873307e..9e1d51b89cc 100644 --- a/src/vs/workbench/contrib/webview/browser/webviewService.ts +++ b/src/vs/workbench/contrib/webview/browser/webviewService.ts @@ -27,7 +27,7 @@ export class WebviewService extends Disposable implements IWebviewService { public get activeWebview() { return this._activeWebview; } - private updateActiveWebview(value: IWebview | undefined) { + private _updateActiveWebview(value: IWebview | undefined) { if (value !== this._activeWebview) { this._activeWebview = value; this._onDidChangeActiveWebview.fire(value); @@ -59,12 +59,12 @@ export class WebviewService extends Disposable implements IWebviewService { this._webviews.add(webview); webview.onDidFocus(() => { - this.updateActiveWebview(webview); + this._updateActiveWebview(webview); }); const onBlur = () => { if (this._activeWebview === webview) { - this.updateActiveWebview(undefined); + this._updateActiveWebview(undefined); } }; diff --git a/src/vs/workbench/contrib/webview/electron-sandbox/webviewElement.ts b/src/vs/workbench/contrib/webview/electron-sandbox/webviewElement.ts index 9c4003f02df..70c635de4f7 100644 --- a/src/vs/workbench/contrib/webview/electron-sandbox/webviewElement.ts +++ b/src/vs/workbench/contrib/webview/electron-sandbox/webviewElement.ts @@ -57,7 +57,7 @@ export class ElectronWebviewElement extends WebviewElement { @IConfigurationService configurationService: IConfigurationService, @IMainProcessService mainProcessService: IMainProcessService, @INotificationService notificationService: INotificationService, - @INativeHostService private readonly nativeHostService: INativeHostService, + @INativeHostService private readonly _nativeHostService: INativeHostService, @IInstantiationService instantiationService: IInstantiationService, @IAccessibilityService accessibilityService: IAccessibilityService, ) { @@ -65,7 +65,7 @@ export class ElectronWebviewElement extends WebviewElement { configurationService, contextMenuService, menuService, notificationService, environmentService, fileService, logService, remoteAuthorityResolverService, telemetryService, tunnelService, instantiationService, accessibilityService); - this._webviewKeyboardHandler = new WindowIgnoreMenuShortcutsManager(configurationService, mainProcessService, nativeHostService); + this._webviewKeyboardHandler = new WindowIgnoreMenuShortcutsManager(configurationService, mainProcessService, _nativeHostService); this._webviewMainService = ProxyChannel.toService(mainProcessService.getChannel('webview')); @@ -127,7 +127,7 @@ export class ElectronWebviewElement extends WebviewElement { } else { // continuing the find, so set findNext to false const options: FindInFrameOptions = { forward: !previous, findNext: false, matchCase: false }; - this._webviewMainService.findInFrame({ windowId: this.nativeHostService.windowId }, this.id, value, options); + this._webviewMainService.findInFrame({ windowId: this._nativeHostService.windowId }, this.id, value, options); } } @@ -145,7 +145,7 @@ export class ElectronWebviewElement extends WebviewElement { this._iframeDelayer.trigger(() => { this._findStarted = true; - this._webviewMainService.findInFrame({ windowId: this.nativeHostService.windowId }, this.id, value, options); + this._webviewMainService.findInFrame({ windowId: this._nativeHostService.windowId }, this.id, value, options); }); } @@ -155,7 +155,7 @@ export class ElectronWebviewElement extends WebviewElement { } this._iframeDelayer.cancel(); this._findStarted = false; - this._webviewMainService.stopFindInFrame({ windowId: this.nativeHostService.windowId }, this.id, { + this._webviewMainService.stopFindInFrame({ windowId: this._nativeHostService.windowId }, this.id, { keepSelection }); this._onDidStopFind.fire(); diff --git a/src/vs/workbench/contrib/webview/electron-sandbox/windowIgnoreMenuShortcutsManager.ts b/src/vs/workbench/contrib/webview/electron-sandbox/windowIgnoreMenuShortcutsManager.ts index ba3258b9545..6d6df9c1292 100644 --- a/src/vs/workbench/contrib/webview/electron-sandbox/windowIgnoreMenuShortcutsManager.ts +++ b/src/vs/workbench/contrib/webview/electron-sandbox/windowIgnoreMenuShortcutsManager.ts @@ -14,16 +14,16 @@ export class WindowIgnoreMenuShortcutsManager { private readonly _isUsingNativeTitleBars: boolean; - private readonly webviewMainService: IWebviewManagerService; + private readonly _webviewMainService: IWebviewManagerService; constructor( configurationService: IConfigurationService, mainProcessService: IMainProcessService, - private readonly nativeHostService: INativeHostService + private readonly _nativeHostService: INativeHostService ) { this._isUsingNativeTitleBars = configurationService.getValue('window.titleBarStyle') === 'native'; - this.webviewMainService = ProxyChannel.toService(mainProcessService.getChannel('webview')); + this._webviewMainService = ProxyChannel.toService(mainProcessService.getChannel('webview')); } public didFocus(): void { @@ -34,13 +34,13 @@ export class WindowIgnoreMenuShortcutsManager { this.setIgnoreMenuShortcuts(false); } - private get shouldToggleMenuShortcutsEnablement() { + private get _shouldToggleMenuShortcutsEnablement() { return isMacintosh || this._isUsingNativeTitleBars; } protected setIgnoreMenuShortcuts(value: boolean) { - if (this.shouldToggleMenuShortcutsEnablement) { - this.webviewMainService.setIgnoreMenuShortcuts({ windowId: this.nativeHostService.windowId }, value); + if (this._shouldToggleMenuShortcutsEnablement) { + this._webviewMainService.setIgnoreMenuShortcuts({ windowId: this._nativeHostService.windowId }, value); } } } From 8f06fd3722cc621bdeba2209780de9fc3725fd58 Mon Sep 17 00:00:00 2001 From: SteVen Batten <6561887+sbatten@users.noreply.github.com> Date: Tue, 1 Nov 2022 12:22:22 -0700 Subject: [PATCH 022/185] only renderBody when view is visible/expanded (#165187) fixes PaneView calls renderBody even when the pane is collapsed #164662 --- src/vs/base/browser/ui/splitview/paneview.ts | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/vs/base/browser/ui/splitview/paneview.ts b/src/vs/base/browser/ui/splitview/paneview.ts index c59e58ef51f..3a2e571540d 100644 --- a/src/vs/base/browser/ui/splitview/paneview.ts +++ b/src/vs/base/browser/ui/splitview/paneview.ts @@ -58,6 +58,7 @@ export abstract class Pane extends Disposable implements IView { private expandedSize: number | undefined = undefined; private _headerVisible = true; + private _bodyRendered = false; private _minimumBodySize: number; private _maximumBodySize: number; private _ariaHeaderLabel: string; @@ -158,6 +159,11 @@ export abstract class Pane extends Disposable implements IView { this.updateHeader(); if (expanded) { + if (!this._bodyRendered) { + this.renderBody(this.body); + this._bodyRendered = true; + } + if (typeof this.animationTimer === 'number') { clearTimeout(this.animationTimer); } @@ -249,7 +255,13 @@ export abstract class Pane extends Disposable implements IView { }); this.body = append(this.element, $('.pane-body')); - this.renderBody(this.body); + + // Only render the body if it will be visible + // Otherwise, render it when the pane is expanded + if (!this._bodyRendered && this.isExpanded()) { + this.renderBody(this.body); + this._bodyRendered = true; + } if (!this.isExpanded()) { this.body.remove(); From a9a1373b1f3de0af2b131ab4b2325d63f7d52b3d Mon Sep 17 00:00:00 2001 From: Megan Rogge Date: Tue, 1 Nov 2022 15:42:49 -0400 Subject: [PATCH 023/185] prevent `.zshenv` recursion (#165174) fix #163843 --- .../contrib/terminal/browser/media/shellIntegration-env.zsh | 5 ++++- .../contrib/terminal/browser/media/shellIntegration-rc.zsh | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/browser/media/shellIntegration-env.zsh b/src/vs/workbench/contrib/terminal/browser/media/shellIntegration-env.zsh index f89c5b4a337..12bbe2dbd45 100644 --- a/src/vs/workbench/contrib/terminal/browser/media/shellIntegration-env.zsh +++ b/src/vs/workbench/contrib/terminal/browser/media/shellIntegration-env.zsh @@ -6,7 +6,10 @@ if [[ -f $USER_ZDOTDIR/.zshenv ]]; then VSCODE_ZDOTDIR=$ZDOTDIR ZDOTDIR=$USER_ZDOTDIR - . $USER_ZDOTDIR/.zshenv + # prevent recursion + if [[ $USER_ZDOTDIR -ne $VSCODE_ZDOTDIR ]]; then + . $USER_ZDOTDIR/.zshenv + fi USER_ZDOTDIR=$ZDOTDIR ZDOTDIR=$VSCODE_ZDOTDIR diff --git a/src/vs/workbench/contrib/terminal/browser/media/shellIntegration-rc.zsh b/src/vs/workbench/contrib/terminal/browser/media/shellIntegration-rc.zsh index 90612eb545b..6cd65d39b8c 100644 --- a/src/vs/workbench/contrib/terminal/browser/media/shellIntegration-rc.zsh +++ b/src/vs/workbench/contrib/terminal/browser/media/shellIntegration-rc.zsh @@ -127,6 +127,6 @@ __vsc_preexec() { add-zsh-hook precmd __vsc_precmd add-zsh-hook preexec __vsc_preexec -if [[ $options[login] = off ]]; then +if [[ $options[login] = off && $USER_ZDOTDIR -ne $VSCODE_ZDOTDIR ]]; then ZDOTDIR=$USER_ZDOTDIR fi From 25c65295ab9d873146383865037994e2dea77e2b Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 1 Nov 2022 12:47:13 -0700 Subject: [PATCH 024/185] Use css vars for lightbulb (#165186) Fixes #165169 --- .../codeAction/browser/lightBulbWidget.css | 32 ++++++++++++++--- .../codeAction/browser/lightBulbWidget.ts | 35 +++---------------- 2 files changed, 32 insertions(+), 35 deletions(-) diff --git a/src/vs/editor/contrib/codeAction/browser/lightBulbWidget.css b/src/vs/editor/contrib/codeAction/browser/lightBulbWidget.css index 29c4fe0c043..087f898f159 100644 --- a/src/vs/editor/contrib/codeAction/browser/lightBulbWidget.css +++ b/src/vs/editor/contrib/codeAction/browser/lightBulbWidget.css @@ -3,14 +3,38 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -.monaco-editor .contentWidgets .codicon-light-bulb, -.monaco-editor .contentWidgets .codicon-lightbulb-autofix { +.monaco-editor .lightBulbWidget { display: flex; align-items: center; justify-content: center; } -.monaco-editor .contentWidgets .codicon-light-bulb:hover, -.monaco-editor .contentWidgets .codicon-lightbulb-autofix:hover { +.monaco-editor .lightBulbWidget:hover{ cursor: pointer; } + +.monaco-editor .lightBulbWidget.codicon-light-bulb { + color: var(--vscode-editorLightBulb-foreground); +} + +.monaco-editor .lightBulbWidget.codicon-lightbulb-autofix { + color: var(--vscode-editorLightBulbAutoFix-foreground, var(--vscode-editorLightBulb-foreground)); +} + +.monaco-editor .lightBulbWidget:before { + position: relative; + z-index: 2; +} + +.monaco-editor .lightBulbWidget:after { + position: absolute; + top: 0; + left: 0; + content: ''; + display: block; + width: 100%; + height: 100%; + opacity: 0.3; + background-color: var(--vscode-editor-background); + z-index: 1; +} diff --git a/src/vs/editor/contrib/codeAction/browser/lightBulbWidget.ts b/src/vs/editor/contrib/codeAction/browser/lightBulbWidget.ts index a91aa9364da..cbcab80c091 100644 --- a/src/vs/editor/contrib/codeAction/browser/lightBulbWidget.ts +++ b/src/vs/editor/contrib/codeAction/browser/lightBulbWidget.ts @@ -17,8 +17,6 @@ import { computeIndentLevel } from 'vs/editor/common/model/utils'; import type { CodeActionSet, CodeActionTrigger } from 'vs/editor/contrib/codeAction/common/types'; import * as nls from 'vs/nls'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; -import { editorBackground, editorLightBulbAutoFixForeground, editorLightBulbForeground } from 'vs/platform/theme/common/colorRegistry'; -import { IColorTheme, ICssStyleCollector, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; namespace LightBulbState { @@ -48,7 +46,7 @@ export class LightBulbWidget extends Disposable implements IContentWidget { private static readonly _posPref = [ContentWidgetPositionPreference.EXACT]; - private readonly _domNode: HTMLDivElement; + private readonly _domNode: HTMLElement; private readonly _onClick = this._register(new Emitter<{ x: number; y: number; actions: CodeActionSet; trigger: CodeActionTrigger }>()); public readonly onClick = this._onClick.event; @@ -65,8 +63,9 @@ export class LightBulbWidget extends Disposable implements IContentWidget { @IKeybindingService keybindingService: IKeybindingService ) { super(); - this._domNode = document.createElement('div'); - this._domNode.className = Codicon.lightBulb.classNames; + + this._domNode = dom.$('div.lightBulbWidget'); + this._register(Gesture.ignoreTarget(this._domNode)); this._editor.addContentWidget(this); @@ -235,29 +234,3 @@ export class LightBulbWidget extends Disposable implements IContentWidget { this._domNode.title = value; } } - -registerThemingParticipant((theme: IColorTheme, collector: ICssStyleCollector) => { - - const editorBackgroundColor = theme.getColor(editorBackground)?.transparent(0.7); - - // Lightbulb Icon - const editorLightBulbForegroundColor = theme.getColor(editorLightBulbForeground); - if (editorLightBulbForegroundColor) { - collector.addRule(` - .monaco-editor .contentWidgets ${Codicon.lightBulb.cssSelector} { - color: ${editorLightBulbForegroundColor}; - background-color: ${editorBackgroundColor}; - }`); - } - - // Lightbulb Auto Fix Icon - const editorLightBulbAutoFixForegroundColor = theme.getColor(editorLightBulbAutoFixForeground); - if (editorLightBulbAutoFixForegroundColor) { - collector.addRule(` - .monaco-editor .contentWidgets ${Codicon.lightbulbAutofix.cssSelector} { - color: ${editorLightBulbAutoFixForegroundColor}; - background-color: ${editorBackgroundColor}; - }`); - } - -}); From decab0af41635314da92395bc9fa28984f7b7de8 Mon Sep 17 00:00:00 2001 From: Henning Dieterichs Date: Tue, 1 Nov 2022 21:15:30 +0100 Subject: [PATCH 025/185] Limit shifting (#165141) --- src/vs/editor/common/diff/algorithms/joinSequenceDiffs.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/vs/editor/common/diff/algorithms/joinSequenceDiffs.ts b/src/vs/editor/common/diff/algorithms/joinSequenceDiffs.ts index 9fb27bf25ed..59ac41dafc3 100644 --- a/src/vs/editor/common/diff/algorithms/joinSequenceDiffs.ts +++ b/src/vs/editor/common/diff/algorithms/joinSequenceDiffs.ts @@ -98,11 +98,13 @@ export function shiftSequenceDiffs(sequence1: ISequence, sequence2: ISequence, s } function shiftDiffToBetterPosition(diff: SequenceDiff, sequence1: ISequence, sequence2: ISequence, seq2NextStart: number, seq2PrevEndExclusive: number) { + const maxShiftLimit = 20; // To prevent performance issues + // don't touch previous or next! let deltaBefore = 1; while (diff.seq1Range.start - deltaBefore > seq2PrevEndExclusive && sequence2.getElement(diff.seq2Range.start - deltaBefore) === - sequence2.getElement(diff.seq2Range.endExclusive - deltaBefore)) { + sequence2.getElement(diff.seq2Range.endExclusive - deltaBefore) && deltaBefore < maxShiftLimit) { deltaBefore++; } deltaBefore--; @@ -110,7 +112,7 @@ function shiftDiffToBetterPosition(diff: SequenceDiff, sequence1: ISequence, seq let deltaAfter = 1; while (diff.seq1Range.start + deltaAfter < seq2NextStart && sequence2.getElement(diff.seq2Range.start + deltaAfter) === - sequence2.getElement(diff.seq2Range.endExclusive + deltaAfter)) { + sequence2.getElement(diff.seq2Range.endExclusive + deltaAfter) && deltaAfter < maxShiftLimit) { deltaAfter++; } deltaAfter--; From a55eaa4d0c11e940f8fef5a9d8020a9946b22614 Mon Sep 17 00:00:00 2001 From: Alexandru Dima Date: Tue, 1 Nov 2022 21:34:50 +0100 Subject: [PATCH 026/185] Do not render synchronously when restoring the state, the desired `scrollLeft` is maintained even if the `scrollWidth` is small (#165193) --- src/vs/editor/browser/view.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/vs/editor/browser/view.ts b/src/vs/editor/browser/view.ts index ec7b39e9028..9fe5e921ae7 100644 --- a/src/vs/editor/browser/view.ts +++ b/src/vs/editor/browser/view.ts @@ -425,11 +425,11 @@ export class View extends ViewEventHandler { } public restoreState(scrollPosition: { scrollLeft: number; scrollTop: number }): void { - this._context.viewModel.viewLayout.setScrollPosition({ scrollTop: scrollPosition.scrollTop }, ScrollType.Immediate); + this._context.viewModel.viewLayout.setScrollPosition({ + scrollTop: scrollPosition.scrollTop, + scrollLeft: scrollPosition.scrollLeft + }, ScrollType.Immediate); this._context.viewModel.tokenizeViewport(); - this._renderNow(); - this._viewLines.updateLineWidths(); - this._context.viewModel.viewLayout.setScrollPosition({ scrollLeft: scrollPosition.scrollLeft }, ScrollType.Immediate); } public getOffsetForColumn(modelLineNumber: number, modelColumn: number): number { From e06811cd9ed4bfb6cc83b4c7cd9c114c2fd1b9bd Mon Sep 17 00:00:00 2001 From: Megan Rogge Date: Tue, 1 Nov 2022 16:37:22 -0400 Subject: [PATCH 027/185] use != operator instead of -ne (#165191) use != operator --- .../contrib/terminal/browser/media/shellIntegration-env.zsh | 2 +- .../contrib/terminal/browser/media/shellIntegration-rc.zsh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/browser/media/shellIntegration-env.zsh b/src/vs/workbench/contrib/terminal/browser/media/shellIntegration-env.zsh index 12bbe2dbd45..4478a3e7923 100644 --- a/src/vs/workbench/contrib/terminal/browser/media/shellIntegration-env.zsh +++ b/src/vs/workbench/contrib/terminal/browser/media/shellIntegration-env.zsh @@ -7,7 +7,7 @@ if [[ -f $USER_ZDOTDIR/.zshenv ]]; then ZDOTDIR=$USER_ZDOTDIR # prevent recursion - if [[ $USER_ZDOTDIR -ne $VSCODE_ZDOTDIR ]]; then + if [[ $USER_ZDOTDIR != $VSCODE_ZDOTDIR ]]; then . $USER_ZDOTDIR/.zshenv fi diff --git a/src/vs/workbench/contrib/terminal/browser/media/shellIntegration-rc.zsh b/src/vs/workbench/contrib/terminal/browser/media/shellIntegration-rc.zsh index 6cd65d39b8c..f90d11f8c64 100644 --- a/src/vs/workbench/contrib/terminal/browser/media/shellIntegration-rc.zsh +++ b/src/vs/workbench/contrib/terminal/browser/media/shellIntegration-rc.zsh @@ -127,6 +127,6 @@ __vsc_preexec() { add-zsh-hook precmd __vsc_precmd add-zsh-hook preexec __vsc_preexec -if [[ $options[login] = off && $USER_ZDOTDIR -ne $VSCODE_ZDOTDIR ]]; then +if [[ $options[login] = off && $USER_ZDOTDIR != $VSCODE_ZDOTDIR ]]; then ZDOTDIR=$USER_ZDOTDIR fi From d810d86c4cc295ad5b575b6c6528446cf3bf6f23 Mon Sep 17 00:00:00 2001 From: Henning Dieterichs Date: Tue, 1 Nov 2022 21:40:45 +0100 Subject: [PATCH 028/185] Audio Cues: Don't play the same sound in parallel. Fixes #164921 (#165194) --- .../contrib/audioCues/browser/audioCueService.ts | 16 +++++++++++++--- .../contrib/audioCues/browser/commands.ts | 2 +- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/contrib/audioCues/browser/audioCueService.ts b/src/vs/workbench/contrib/audioCues/browser/audioCueService.ts index ce7a4d8a1b0..b2ab0e3d458 100644 --- a/src/vs/workbench/contrib/audioCues/browser/audioCueService.ts +++ b/src/vs/workbench/contrib/audioCues/browser/audioCueService.ts @@ -21,7 +21,7 @@ export interface IAudioCueService { playAudioCues(cues: AudioCue[]): Promise; isEnabled(cue: AudioCue): IObservable; - playSound(cue: Sound): Promise; + playSound(cue: Sound, allowManyInParallel?: boolean): Promise; } export class AudioCueService extends Disposable implements IAudioCueService { @@ -60,14 +60,24 @@ export class AudioCueService extends Disposable implements IAudioCueService { return Math.max(Math.min(volume, 100), 0); } - public async playSound(sound: Sound): Promise { + private playingSounds = new Set(); + + public async playSound(sound: Sound, allowManyInParallel = false): Promise { + if (!allowManyInParallel && this.playingSounds.has(sound)) { + return; + } + + this.playingSounds.add(sound); + const url = FileAccess.asBrowserUri( `vs/workbench/contrib/audioCues/browser/media/${sound.fileName}`, require ).toString(); const audio = new Audio(url); audio.volume = this.getVolumeInPercent() / 100; - + audio.addEventListener('ended', () => { + this.playingSounds.delete(sound); + }); try { try { // Don't play when loading takes more than 1s, due to loading, decoding or playing issues. diff --git a/src/vs/workbench/contrib/audioCues/browser/commands.ts b/src/vs/workbench/contrib/audioCues/browser/commands.ts index 34214fed28d..ab6b124bfce 100644 --- a/src/vs/workbench/contrib/audioCues/browser/commands.ts +++ b/src/vs/workbench/contrib/audioCues/browser/commands.ts @@ -48,7 +48,7 @@ export class ShowAudioCueHelp extends Action2 { { activeItem: items[0], onDidFocus: (item) => { - audioCueService.playSound(item.audioCue.sound); + audioCueService.playSound(item.audioCue.sound, true); }, onDidTriggerItemButton: (context) => { preferencesService.openSettings({ query: context.item.audioCue.settingsKey }); From 856a306d1a9b0879727421daf21a8059e671e3ea Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Tue, 1 Nov 2022 14:06:59 -0700 Subject: [PATCH 029/185] re #164939. reduced unused exports. (#165196) --- .../pieceTreeTextBuffer/pieceTreeBase.ts | 10 +-- .../pieceTreeTextBuffer.ts | 2 +- .../pieceTreeTextBufferBuilder.ts | 2 +- .../model/pieceTreeTextBuffer/rbTreeBase.ts | 6 +- .../browser/view/cellParts/cellOutput.ts | 2 +- .../browser/view/cellParts/cellWidgets.ts | 67 ------------------- .../common/model/notebookTextModel.ts | 4 +- .../common/services/notebookSimpleWorker.ts | 2 +- 8 files changed, 14 insertions(+), 81 deletions(-) diff --git a/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeBase.ts b/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeBase.ts index ae32355c72c..405b13f5d5b 100644 --- a/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeBase.ts +++ b/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeBase.ts @@ -11,9 +11,9 @@ import { NodeColor, SENTINEL, TreeNode, fixInsert, leftest, rbDelete, righttest, import { Searcher, createFindMatch, isValidMatch } from 'vs/editor/common/model/textModelSearch'; // const lfRegex = new RegExp(/\r\n|\r|\n/g); -export const AverageBufferSize = 65535; +const AverageBufferSize = 65535; -export function createUintArray(arr: number[]): Uint32Array | Uint16Array { +function createUintArray(arr: number[]): Uint32Array | Uint16Array { let r; if (arr[arr.length - 1] < 65536) { r = new Uint16Array(arr.length); @@ -24,7 +24,7 @@ export function createUintArray(arr: number[]): Uint32Array | Uint16Array { return r; } -export class LineStarts { +class LineStarts { constructor( public readonly lineStarts: Uint32Array | Uint16Array | number[], public readonly cr: number, @@ -98,7 +98,7 @@ export function createLineStarts(r: number[], str: string): LineStarts { return result; } -export interface NodePosition { +interface NodePosition { /** * Piece Index */ @@ -113,7 +113,7 @@ export interface NodePosition { nodeStartOffset: number; } -export interface BufferCursor { +interface BufferCursor { /** * Line number in current buffer */ diff --git a/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBuffer.ts b/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBuffer.ts index 8d27be4fb95..12d7e0b0981 100644 --- a/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBuffer.ts +++ b/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBuffer.ts @@ -27,7 +27,7 @@ export interface IValidatedEditOperation { isAutoWhitespaceEdit: boolean; } -export interface IReverseSingleEditOperation extends IValidEditOperation { +interface IReverseSingleEditOperation extends IValidEditOperation { sortIndex: number; } diff --git a/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBufferBuilder.ts b/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBufferBuilder.ts index f0bdedc4507..6afe8339c96 100644 --- a/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBufferBuilder.ts +++ b/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBufferBuilder.ts @@ -10,7 +10,7 @@ import { DefaultEndOfLine, ITextBuffer, ITextBufferBuilder, ITextBufferFactory } import { StringBuffer, createLineStarts, createLineStartsFast } from 'vs/editor/common/model/pieceTreeTextBuffer/pieceTreeBase'; import { PieceTreeTextBuffer } from 'vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBuffer'; -export class PieceTreeTextBufferFactory implements ITextBufferFactory { +class PieceTreeTextBufferFactory implements ITextBufferFactory { constructor( private readonly _chunks: StringBuffer[], diff --git a/src/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase.ts b/src/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase.ts index 107f6bf8153..1d6301b12c6 100644 --- a/src/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase.ts +++ b/src/vs/editor/common/model/pieceTreeTextBuffer/rbTreeBase.ts @@ -102,7 +102,7 @@ export function righttest(node: TreeNode): TreeNode { return node; } -export function calculateSize(node: TreeNode): number { +function calculateSize(node: TreeNode): number { if (node === SENTINEL) { return 0; } @@ -110,7 +110,7 @@ export function calculateSize(node: TreeNode): number { return node.size_left + node.piece.length + calculateSize(node.right); } -export function calculateLF(node: TreeNode): number { +function calculateLF(node: TreeNode): number { if (node === SENTINEL) { return 0; } @@ -118,7 +118,7 @@ export function calculateLF(node: TreeNode): number { return node.lf_left + node.piece.lineFeedCnt + calculateLF(node.right); } -export function resetSentinel(): void { +function resetSentinel(): void { SENTINEL.parent = SENTINEL; } diff --git a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellOutput.ts b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellOutput.ts index ee31645ce37..69052c4576f 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellOutput.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellOutput.ts @@ -56,7 +56,7 @@ interface IRenderResult { // | #output-inner-container // | | #cell-output-toolbar // | | #output-element -export class CellOutputElement extends Disposable { +class CellOutputElement extends Disposable { private readonly _renderDisposableStore = this._register(new DisposableStore()); innerContainer?: HTMLElement; diff --git a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellWidgets.ts b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellWidgets.ts index 211ec648e88..da7ba6690cb 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellWidgets.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellWidgets.ts @@ -3,10 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as DOM from 'vs/base/browser/dom'; -import { Disposable } from 'vs/base/common/lifecycle'; -import { IDimension } from 'vs/editor/common/core/dimension'; - export interface IClickTarget { type: ClickTargetType; event: MouseEvent; @@ -17,66 +13,3 @@ export const enum ClickTargetType { ContributedTextItem = 1, ContributedCommandItem = 2 } - -export interface IResizeObserver { - startObserving: () => void; - stopObserving: () => void; - getWidth(): number; - getHeight(): number; - dispose(): void; -} - -export class BrowserResizeObserver extends Disposable implements IResizeObserver { - private readonly referenceDomElement: HTMLElement | null; - - private readonly observer: ResizeObserver; - private width: number; - private height: number; - - constructor(referenceDomElement: HTMLElement | null, dimension: IDimension | undefined, changeCallback: () => void) { - super(); - - this.referenceDomElement = referenceDomElement; - this.width = -1; - this.height = -1; - - this.observer = new ResizeObserver((entries: any) => { - for (const entry of entries) { - if (entry.target === referenceDomElement && entry.contentRect) { - if (this.width !== entry.contentRect.width || this.height !== entry.contentRect.height) { - this.width = entry.contentRect.width; - this.height = entry.contentRect.height; - DOM.scheduleAtNextAnimationFrame(() => { - changeCallback(); - }); - } - } - } - }); - } - - getWidth(): number { - return this.width; - } - - getHeight(): number { - return this.height; - } - - startObserving(): void { - this.observer.observe(this.referenceDomElement!); - } - - stopObserving(): void { - this.observer.unobserve(this.referenceDomElement!); - } - - override dispose(): void { - this.observer.disconnect(); - super.dispose(); - } -} - -export function getResizesObserver(referenceDomElement: HTMLElement | null, dimension: IDimension | undefined, changeCallback: () => void): IResizeObserver { - return new BrowserResizeObserver(referenceDomElement, dimension, changeCallback); -} diff --git a/src/vs/workbench/contrib/notebook/common/model/notebookTextModel.ts b/src/vs/workbench/contrib/notebook/common/model/notebookTextModel.ts index a2eda153198..cc14c4f07e8 100644 --- a/src/vs/workbench/contrib/notebook/common/model/notebookTextModel.ts +++ b/src/vs/workbench/contrib/notebook/common/model/notebookTextModel.ts @@ -100,7 +100,7 @@ class StackOperation implements IWorkspaceUndoRedoElement { } } -export class NotebookOperationManager { +class NotebookOperationManager { private _pendingStackOperation: StackOperation | null = null; constructor( private readonly _textModel: NotebookTextModel, @@ -144,7 +144,7 @@ type TransformedEdit = { originalIndex: number; }; -export class NotebookEventEmitter extends PauseableEmitter { +class NotebookEventEmitter extends PauseableEmitter { isDirtyEvent() { for (const e of this._eventQueue) { for (let i = 0; i < e.rawEvents.length; i++) { diff --git a/src/vs/workbench/contrib/notebook/common/services/notebookSimpleWorker.ts b/src/vs/workbench/contrib/notebook/common/services/notebookSimpleWorker.ts index f07e2ac2bec..ac2d2f5f8ae 100644 --- a/src/vs/workbench/contrib/notebook/common/services/notebookSimpleWorker.ts +++ b/src/vs/workbench/contrib/notebook/common/services/notebookSimpleWorker.ts @@ -154,7 +154,7 @@ class MirrorNotebookDocument { } } -export class CellSequence implements ISequence { +class CellSequence implements ISequence { constructor(readonly textModel: MirrorNotebookDocument) { } From 1880c8ea6c20ab59e69f1293a563aedf5c14279d Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Tue, 1 Nov 2022 14:19:29 -0700 Subject: [PATCH 030/185] re #164939. reduced unused exports in notebook worker. (#165198) --- .../browser/services/notebookWorkerServiceImpl.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/contrib/notebook/browser/services/notebookWorkerServiceImpl.ts b/src/vs/workbench/contrib/notebook/browser/services/notebookWorkerServiceImpl.ts index 026490e8404..49fbb10d90b 100644 --- a/src/vs/workbench/contrib/notebook/browser/services/notebookWorkerServiceImpl.ts +++ b/src/vs/workbench/contrib/notebook/browser/services/notebookWorkerServiceImpl.ts @@ -37,7 +37,7 @@ export class NotebookEditorWorkerServiceImpl extends Disposable implements INote } } -export class WorkerManager extends Disposable { +class WorkerManager extends Disposable { private _editorWorkerClient: NotebookWorkerClient | null; // private _lastWorkerUsedTime: number; @@ -58,12 +58,12 @@ export class WorkerManager extends Disposable { } } -export interface IWorkerClient { +interface IWorkerClient { getProxyObject(): Promise; dispose(): void; } -export class NotebookEditorModelManager extends Disposable { +class NotebookEditorModelManager extends Disposable { private _syncedModels: { [modelUrl: string]: IDisposable } = Object.create(null); private _syncedModelsLastUsedTime: { [modelUrl: string]: number } = Object.create(null); @@ -193,7 +193,7 @@ class NotebookWorkerHost implements INotebookWorkerHost { } } -export class NotebookWorkerClient extends Disposable { +class NotebookWorkerClient extends Disposable { private _worker: IWorkerClient | null; private readonly _workerFactory: DefaultWorkerFactory; private _modelManager: NotebookEditorModelManager | null; From 190db489e08f2dca06332015db8e3197480c64c9 Mon Sep 17 00:00:00 2001 From: Hugh Lilly Date: Wed, 2 Nov 2022 11:48:59 +1300 Subject: [PATCH 031/185] Markdown lang preview settings description (#165109) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Change descriptions to just say “Enable…” Previously these said “Enable or disable…”, which in the context of a tick box doesn’t make sense. * Change “Enable/disable” wording in descriptions --- .../package.nls.json | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/extensions/markdown-language-features/package.nls.json b/extensions/markdown-language-features/package.nls.json index 92bada66562..7278d236110 100644 --- a/extensions/markdown-language-features/package.nls.json +++ b/extensions/markdown-language-features/package.nls.json @@ -2,8 +2,8 @@ "displayName": "Markdown Language Features", "description": "Provides rich language support for Markdown.", "markdown.preview.breaks.desc": "Sets how line-breaks are rendered in the Markdown preview. Setting it to 'true' creates a
for newlines inside paragraphs.", - "markdown.preview.linkify": "Enable or disable conversion of URL-like text to links in the Markdown preview.", - "markdown.preview.typographer": "Enable or disable some language-neutral replacement and quotes beautification in the Markdown preview.", + "markdown.preview.linkify": "Convert URL-like text to links in the Markdown preview.", + "markdown.preview.typographer": "Enable some language-neutral replacement and quotes beautification in the Markdown preview.", "markdown.preview.doubleClickToSwitchToEditor.desc": "Double click in the Markdown preview to switch to the editor.", "markdown.preview.fontFamily.desc": "Controls the font family used in the Markdown preview.", "markdown.preview.fontSize.desc": "Controls the font size in pixels used in the Markdown preview.", @@ -30,10 +30,10 @@ "configuration.markdown.links.openLocation.description": "Controls where links in Markdown files should be opened.", "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 while writing links in Markdown files.", - "configuration.markdown.editor.drop.enabled": "Enable/disable dropping files into a Markdown editor by holding down shift. Requires enabling `#editor.dropIntoEditor.enabled#`.", - "configuration.markdown.editor.pasteLinks.enabled": "Enable/disable pasting files into a Markdown editor inserts Markdown links. Requires enabling `#editor.experimental.pasteActions.enabled#`.", - "configuration.markdown.validate.enabled.description": "Enable/disable all error reporting in Markdown files.", + "configuration.markdown.suggest.paths.enabled.description": "Enable path suggestions while writing links in Markdown files.", + "configuration.markdown.editor.drop.enabled": "Enable dropping files into a Markdown editor while holding Shift. Requires enabling `#editor.dropIntoEditor.enabled#`.", + "configuration.markdown.editor.pasteLinks.enabled": "Enable pasting files into a Markdown editor inserts Markdown links. Requires enabling `#editor.experimental.pasteActions.enabled#`.", + "configuration.markdown.validate.enabled.description": "Enable all error reporting in Markdown files.", "configuration.markdown.validate.referenceLinks.enabled.description": "Validate reference links in Markdown files, e.g. `[link][ref]`. Requires enabling `#markdown.validate.enabled#`.", "configuration.markdown.validate.fragmentLinks.enabled.description": "Validate fragment links to headers in the current Markdown file, e.g. `[link](#header)`. Requires enabling `#markdown.validate.enabled#`.", "configuration.markdown.validate.fileLinks.enabled.description": "Validate links to other files in Markdown files, e.g. `[link](/path/to/file.md)`. This checks that the target files exists. Requires enabling `#markdown.validate.enabled#`.", @@ -46,8 +46,8 @@ "configuration.markdown.updateLinksOnFileMove.enabled.always": "Always update links automatically.", "configuration.markdown.updateLinksOnFileMove.enabled.never": "Never try to update link and don't prompt.", "configuration.markdown.updateLinksOnFileMove.include": "Glob patterns that specifies which files that trigger automatic link updates. See `#markdown.updateLinksOnFileMove.enabled#` for details about this feature.", - "configuration.markdown.updateLinksOnFileMove.include.property": "The glob pattern to match file paths against. Set to true or false to enable or disable the pattern.", - "configuration.markdown.updateLinksOnFileMove.enableForDirectories": "Enable/disable updating links when a directory is moved or renamed in the workspace.", - "configuration.markdown.occurrencesHighlight.enabled": "Enable/disable highlighting link occurrences in the current document.", + "configuration.markdown.updateLinksOnFileMove.include.property": "The glob pattern to match file paths against. Set to true to enable the pattern.", + "configuration.markdown.updateLinksOnFileMove.enableForDirectories": "Enable updating links when a directory is moved or renamed in the workspace.", + "configuration.markdown.occurrencesHighlight.enabled": "Enable highlighting link occurrences in the current document.", "workspaceTrust": "Required for loading styles configured in the workspace." } From a9bf3117d80c340ad663ba5b6001702ead02f2a8 Mon Sep 17 00:00:00 2001 From: zhuowei Date: Tue, 1 Nov 2022 18:56:43 -0400 Subject: [PATCH 032/185] webview: ignore Ctrl+W and Ctrl+N in webview for PWA (#164981) This fixes closing Release Notes / Markdown Preview with Ctrl+W closing whole PWA. PWAs can intercept the Ctrl+W/Ctrl+N keystrokes, and VSCode does this for editor tabs. However, webviews do not intercept these keystrokes. If a webview such as Release Notes or Markdown Preview has focus: - when the user presses Ctrl+N, another instance of the PWA is opened in a new window. - when the user presses Ctrl+W, the whole PWA window closes. See https://github.com/microsoft/vscode/issues/150735 for details. This fixes the issue by ignoring Ctrl+W and Ctrl+N in webviews. Tested on macOS 12.6 / Chrome Dev 109.0.5384.0: - patch environmentService.ts webviewExternalEndpoint to use http://localhost:8080/static/sources/out/vs/workbench/contrib/webview/browser/pre/ - followed the contributing instruction to run code-web - in Chrome, More Tools -> Create Shortcut -> Open as window - closed and re-opened Code OSS PWA window - opened chrome://inspect and inspected the Code OSS window - added an uncaught exception handler - opened file.md and chose "Open preview" - when it hit `Expected '${parentOriginHash}' as hostname or subdomain!` manually ran `start(parentOrigin)` in console and continued - the markdown preview now displayed - pressed Command+W Before: the whole window closes After: only the Markdown preview tab closes --- .../webview/browser/pre/index-no-csp.html | 22 +++++++++++++++++ .../contrib/webview/browser/pre/index.html | 24 ++++++++++++++++++- 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/webview/browser/pre/index-no-csp.html b/src/vs/workbench/contrib/webview/browser/pre/index-no-csp.html index 781275829d5..009048a23bb 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/index-no-csp.html +++ b/src/vs/workbench/contrib/webview/browser/pre/index-no-csp.html @@ -589,6 +589,10 @@ } else { return; // let the browser handle this } + } else if (!onElectron && (isCloseTab(e) || isNewWindow(e))) { + // Prevent Ctrl+W closing window / Ctrl+N opening new window in PWA. + // (No effect in a regular browser tab.) + e.preventDefault(); } hostMessaging.postMessage('did-keydown', { @@ -655,6 +659,24 @@ return hasMeta && e.key.toLowerCase() === 'f'; } + /** + * @param {KeyboardEvent} e + * @return {boolean} + */ + function isCloseTab(e) { + const hasMeta = e.ctrlKey || e.metaKey; + return hasMeta && e.key.toLowerCase() === 'w'; + } + + /** + * @param {KeyboardEvent} e + * @return {boolean} + */ + function isNewWindow(e) { + const hasMeta = e.ctrlKey || e.metaKey; + return hasMeta && e.key.toLowerCase() === 'n'; + } + let isHandlingScroll = false; /** diff --git a/src/vs/workbench/contrib/webview/browser/pre/index.html b/src/vs/workbench/contrib/webview/browser/pre/index.html index 71f7c839ab6..0fb3e7456d0 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/index.html +++ b/src/vs/workbench/contrib/webview/browser/pre/index.html @@ -5,7 +5,7 @@ + content="default-src 'none'; script-src 'sha256-DmsqQtB7vkf/ey+8HeQmSYaMMdiE0Au1IXEkLBE+OtY=' 'self'; frame-src 'self'; style-src 'unsafe-inline';"> Date: Tue, 1 Nov 2022 16:38:45 -0700 Subject: [PATCH 033/185] Prompt users to test with extensions disabled (#165203) --- .../src/typescriptServiceClient.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/extensions/typescript-language-features/src/typescriptServiceClient.ts b/extensions/typescript-language-features/src/typescriptServiceClient.ts index 169df72d203..18a9f864c6c 100644 --- a/extensions/typescript-language-features/src/typescriptServiceClient.ts +++ b/extensions/typescript-language-features/src/typescriptServiceClient.ts @@ -1036,7 +1036,13 @@ function getReportIssueArgsForError( ]; if (globalPlugins.length) { - sections.push(`**Global TS Server Plugins**\n\n` + globalPlugins.map(plugin => `- \`${plugin.name}\``).join('\n')); + sections.push( + [ + `**Global TypeScript Server Plugins**`, + `❗️ Please test with extensions disabled. Extensions are the root cause of most TypeScript server crashes`, + globalPlugins.map(plugin => `- \`${plugin.name}\``).join('\n') + ].join('\n\n') + ); } if (logPath) { From c6559ccf214af75f582412782710c785847a7e3a Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 1 Nov 2022 16:39:15 -0700 Subject: [PATCH 034/185] Pick up TS 4.9 rc for bundled VS Code version (#165205) --- extensions/package.json | 2 +- extensions/yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/extensions/package.json b/extensions/package.json index 4c6be844716..ab0a515dacf 100644 --- a/extensions/package.json +++ b/extensions/package.json @@ -4,7 +4,7 @@ "license": "MIT", "description": "Dependencies shared by all extensions", "dependencies": { - "typescript": "^4.9.0-dev.20221031" + "typescript": "^4.9.2-rc" }, "scripts": { "postinstall": "node ./postinstall.mjs" diff --git a/extensions/yarn.lock b/extensions/yarn.lock index 795a18ddac5..9d6fa08317e 100644 --- a/extensions/yarn.lock +++ b/extensions/yarn.lock @@ -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.9.0-dev.20221031: - version "4.9.0-dev.20221031" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.0-dev.20221031.tgz#bf032089b6337a96a9de6de4fcce074a305ee14d" - integrity sha512-jCNHTa9twe5d/5Pfob2BhOLwHS6kxMcGyc3fIWDGGkEdkyYYbiXD2czz1U6jVOB+9QaVxVNUQuDfN42H5DGZZg== +typescript@^4.9.2-rc: + version "4.9.2-rc" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.2-rc.tgz#3525dbeb8458a8c98ce7d60724e4a9380d7b46e7" + integrity sha512-Ly9UUxJBfiiFjfegI1gsW9FI8Xhw1cuwRMBJ4wdYg+UXZR4VnZvD1OnBDj/iQ2U+tWbWEjYqJ5xx1Cwr4Vsa4w== vscode-grammar-updater@^1.1.0: version "1.1.0" From bb4e4c44bd7cc4126380c69624862d3c165415e0 Mon Sep 17 00:00:00 2001 From: SteVen Batten <6561887+sbatten@users.noreply.github.com> Date: Tue, 1 Nov 2022 17:03:34 -0700 Subject: [PATCH 035/185] don't create and dispose submenus (#165206) fixes #161413 --- .../browser/parts/titlebar/menubarControl.ts | 68 ++++++++----------- .../parts/titlebar/menubarControl.ts | 34 ++++------ 2 files changed, 41 insertions(+), 61 deletions(-) diff --git a/src/vs/workbench/browser/parts/titlebar/menubarControl.ts b/src/vs/workbench/browser/parts/titlebar/menubarControl.ts index 8faed73f311..7ccc25f481b 100644 --- a/src/vs/workbench/browser/parts/titlebar/menubarControl.ts +++ b/src/vs/workbench/browser/parts/titlebar/menubarControl.ts @@ -41,6 +41,7 @@ import { ICommandService } from 'vs/platform/commands/common/commands'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { OpenRecentAction } from 'vs/workbench/browser/actions/windowActions'; import { isICommandActionToggleInfo } from 'vs/platform/action/common/action'; +import { createAndFillInContextMenuActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; export type IOpenRecentAction = IAction & { uri: URI; remoteAuthority?: string }; @@ -646,6 +647,12 @@ export class CustomMenubarControl extends MenubarControl { this._onVisibilityChange.fire(visible); } + private toActionsArray(menu: IMenu): IAction[] { + const result: IAction[] = []; + createAndFillInContextMenuActions(menu, { shouldForwardArgs: true }, result); + return result; + } + private reinstallDisposables = this._register(new DisposableStore()); private setupCustomMenubar(firstTime: boolean): void { // If there is no container, we cannot setup the menubar @@ -704,67 +711,48 @@ export class CustomMenubarControl extends MenubarControl { } // Update the menu actions - const updateActions = (menu: IMenu, target: IAction[], topLevelTitle: string) => { + const updateActions = (menuActions: readonly IAction[], target: IAction[], topLevelTitle: string) => { target.splice(0); - const groups = menu.getActions(); - for (const group of groups) { - const [, actions] = group; - - for (const action of actions) { - this.insertActionsBefore(action, target); + for (const menuItem of menuActions) { + this.insertActionsBefore(menuItem, target); + if (menuItem instanceof Separator) { + target.push(menuItem); + } else if (menuItem instanceof SubmenuItemAction || menuItem instanceof MenuItemAction) { // use mnemonicTitle whenever possible - let title = typeof action.item.title === 'string' - ? action.item.title - : action.item.title.mnemonicTitle ?? action.item.title.value; - - if (action instanceof SubmenuItemAction) { - let submenu = this.menus[action.item.submenu.id]; - if (!submenu) { - submenu = this.mainMenuDisposables.add(this.menus[action.item.submenu.id] = this.menuService.createMenu(action.item.submenu, this.contextKeyService)); - this.mainMenuDisposables.add(submenu.onDidChange(() => { - if (!this.focusInsideMenubar) { - const actions: IAction[] = []; - updateActions(menu, actions, topLevelTitle); - if (this.menubar && this.topLevelTitles[topLevelTitle]) { - this.menubar.updateMenu({ actions: actions, label: mnemonicMenuLabel(this.topLevelTitles[topLevelTitle]) }); - } - } - }, this)); - } + let title = typeof menuItem.item.title === 'string' + ? menuItem.item.title + : menuItem.item.title.mnemonicTitle ?? menuItem.item.title.value; + if (menuItem instanceof SubmenuItemAction) { const submenuActions: SubmenuAction[] = []; - updateActions(submenu, submenuActions, topLevelTitle); + updateActions(menuItem.actions, submenuActions, topLevelTitle); if (submenuActions.length > 0) { - target.push(new SubmenuAction(action.id, mnemonicMenuLabel(title), submenuActions)); + target.push(new SubmenuAction(menuItem.id, mnemonicMenuLabel(title), submenuActions)); } } else { - if (isICommandActionToggleInfo(action.item.toggled)) { - title = action.item.toggled.mnemonicTitle ?? action.item.toggled.title ?? title; + if (isICommandActionToggleInfo(menuItem.item.toggled)) { + title = menuItem.item.toggled.mnemonicTitle ?? menuItem.item.toggled.title ?? title; } - const newAction = new Action(action.id, mnemonicMenuLabel(title), action.class, action.enabled, () => this.commandService.executeCommand(action.id)); - newAction.tooltip = action.tooltip; - newAction.checked = action.checked; + const newAction = new Action(menuItem.id, mnemonicMenuLabel(title), menuItem.class, menuItem.enabled, () => this.commandService.executeCommand(menuItem.id)); + newAction.tooltip = menuItem.tooltip; + newAction.checked = menuItem.checked; target.push(newAction); } } - target.push(new Separator()); } // Append web navigation menu items to the file menu when not compact - if (menu === this.menus.File && this.currentCompactMenuMode === undefined) { + if (topLevelTitle === 'File' && this.currentCompactMenuMode === undefined) { const webActions = this.getWebNavigationActions(); if (webActions.length) { target.push(...webActions); - target.push(new Separator()); // to account for pop below } } - - target.pop(); }; for (const title of Object.keys(this.topLevelTitles)) { @@ -773,7 +761,7 @@ export class CustomMenubarControl extends MenubarControl { this.reinstallDisposables.add(menu.onDidChange(() => { if (!this.focusInsideMenubar) { const actions: IAction[] = []; - updateActions(menu, actions, title); + updateActions(this.toActionsArray(menu), actions, title); this.menubar?.updateMenu({ actions: actions, label: mnemonicMenuLabel(this.topLevelTitles[title]) }); } })); @@ -783,7 +771,7 @@ export class CustomMenubarControl extends MenubarControl { this.reinstallDisposables.add(this.webNavigationMenu.onDidChange(() => { if (!this.focusInsideMenubar) { const actions: IAction[] = []; - updateActions(menu, actions, title); + updateActions(this.toActionsArray(menu), actions, title); this.menubar?.updateMenu({ actions: actions, label: mnemonicMenuLabel(this.topLevelTitles[title]) }); } })); @@ -792,7 +780,7 @@ export class CustomMenubarControl extends MenubarControl { const actions: IAction[] = []; if (menu) { - updateActions(menu, actions, title); + updateActions(this.toActionsArray(menu), actions, title); } if (this.menubar) { diff --git a/src/vs/workbench/electron-sandbox/parts/titlebar/menubarControl.ts b/src/vs/workbench/electron-sandbox/parts/titlebar/menubarControl.ts index 837eb1b9a25..00c58af451d 100644 --- a/src/vs/workbench/electron-sandbox/parts/titlebar/menubarControl.ts +++ b/src/vs/workbench/electron-sandbox/parts/titlebar/menubarControl.ts @@ -3,8 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { Separator } from 'vs/base/common/actions'; -import { IMenuService, IMenu, SubmenuItemAction } from 'vs/platform/actions/common/actions'; +import { IAction, Separator } from 'vs/base/common/actions'; +import { IMenuService, SubmenuItemAction, MenuItemAction } from 'vs/platform/actions/common/actions'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IWorkspacesService } from 'vs/platform/workspaces/common/workspaces'; import { isMacintosh } from 'vs/base/common/platform'; @@ -26,6 +26,7 @@ import { IPreferencesService } from 'vs/workbench/services/preferences/common/pr import { ICommandService } from 'vs/platform/commands/common/commands'; import { OpenRecentAction } from 'vs/workbench/browser/actions/windowActions'; import { isICommandActionToggleInfo } from 'vs/platform/action/common/action'; +import { createAndFillInContextMenuActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; export class NativeMenubarControl extends MenubarControl { @@ -93,7 +94,9 @@ export class NativeMenubarControl extends MenubarControl { const menu = this.menus[topLevelMenuName]; if (menu) { const menubarMenu: IMenubarMenu = { items: [] }; - this.populateMenuItems(menu, menubarMenu, menubarData.keybindings); + const menuActions: IAction[] = []; + createAndFillInContextMenuActions(menu, { shouldForwardArgs: true }, menuActions); + this.populateMenuItems(menuActions, menubarMenu, menubarData.keybindings); if (menubarMenu.items.length === 0) { return false; // Menus are incomplete } @@ -104,13 +107,11 @@ export class NativeMenubarControl extends MenubarControl { return true; } - private populateMenuItems(menu: IMenu, menuToPopulate: IMenubarMenu, keybindings: { [id: string]: IMenubarKeybinding | undefined }) { - const groups = menu.getActions(); - - for (const group of groups) { - const [, actions] = group; - - actions.forEach(menuItem => { + private populateMenuItems(menuActions: readonly IAction[], menuToPopulate: IMenubarMenu, keybindings: { [id: string]: IMenubarKeybinding | undefined }) { + for (const menuItem of menuActions) { + if (menuItem instanceof Separator) { + menuToPopulate.items.push({ id: 'vscode.menubar.separator' }); + } else if (menuItem instanceof MenuItemAction || menuItem instanceof SubmenuItemAction) { // use mnemonicTitle whenever possible const title = typeof menuItem.item.title === 'string' @@ -120,8 +121,7 @@ export class NativeMenubarControl extends MenubarControl { if (menuItem instanceof SubmenuItemAction) { const submenu = { items: [] }; - const menuToDispose = this.menuService.createMenu(menuItem.item.submenu, this.contextKeyService); - this.populateMenuItems(menuToDispose, submenu, keybindings); + this.populateMenuItems(menuItem.actions, submenu, keybindings); if (submenu.items.length > 0) { const menubarSubmenuItem: IMenubarMenuItemSubmenu = { @@ -132,8 +132,6 @@ export class NativeMenubarControl extends MenubarControl { menuToPopulate.items.push(menubarSubmenuItem); } - - menuToDispose.dispose(); } else { if (menuItem.id === OpenRecentAction.ID) { const actions = this.getOpenRecentActions().map(this.transformOpenRecentAction); @@ -160,13 +158,7 @@ export class NativeMenubarControl extends MenubarControl { keybindings[menuItem.id] = this.getMenubarKeybinding(menuItem.id); menuToPopulate.items.push(menubarMenuItem); } - }); - - menuToPopulate.items.push({ id: 'vscode.menubar.separator' }); - } - - if (menuToPopulate.items.length > 0) { - menuToPopulate.items.pop(); + } } } From 7233e19dd554c7a299f73ea0c667521955ae096c Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 1 Nov 2022 17:23:32 -0700 Subject: [PATCH 036/185] Remove notebook content provider api (#165195) Fixes #160580 Fixes #147248 --- .../notebook.kernel.test.ts | 18 +++--- .../api/browser/mainThreadNotebook.ts | 57 +++---------------- .../workbench/api/common/extHost.api.impl.ts | 8 --- .../workbench/api/common/extHost.protocol.ts | 5 -- .../workbench/api/common/extHostNotebook.ts | 47 --------------- .../api/test/browser/extHostNotebook.test.ts | 8 +-- .../browser/extHostNotebookKernel.test.ts | 4 +- .../notebook/browser/notebookEditorWidget.ts | 11 +++- .../common/extensionsApiProposals.ts | 1 - ...code.proposed.notebookContentProvider.d.ts | 35 ------------ 10 files changed, 27 insertions(+), 167 deletions(-) delete mode 100644 src/vscode-dts/vscode.proposed.notebookContentProvider.d.ts diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/notebook.kernel.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/notebook.kernel.test.ts index fa92d91e8a2..75b1b6fb4e0 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/notebook.kernel.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/notebook.kernel.test.ts @@ -85,15 +85,11 @@ async function assertKernel(kernel: Kernel, notebook: vscode.NotebookDocument): assert.ok(kernel.associatedNotebooks.has(notebook.uri.toString())); } -const apiTestContentProvider: vscode.NotebookContentProvider = { - openNotebook: async (resource: vscode.Uri): Promise => { - if (/.*empty\-.*\.vsctestnb$/.test(resource.path)) { - return { - metadata: {}, - cells: [] - }; - } - +const apiTestSerializer: vscode.NotebookSerializer = { + serializeNotebook(_data, _token) { + return new Uint8Array(); + }, + deserializeNotebook(_content, _token) { const dto: vscode.NotebookData = { metadata: { custom: { testMetadata: false } }, cells: [ @@ -143,8 +139,8 @@ const apiTestContentProvider: vscode.NotebookContentProvider = { suiteDisposables.length = 0; }); - suiteSetup(function () { - suiteDisposables.push(vscode.workspace.registerNotebookContentProvider('notebookCoreTest', apiTestContentProvider)); + suiteSetup(() => { + suiteDisposables.push(vscode.workspace.registerNotebookSerializer('notebookCoreTest', apiTestSerializer)); }); let defaultKernel: Kernel; diff --git a/src/vs/workbench/api/browser/mainThreadNotebook.ts b/src/vs/workbench/api/browser/mainThreadNotebook.ts index 51986a3ad3c..3b877b3dd48 100644 --- a/src/vs/workbench/api/browser/mainThreadNotebook.ts +++ b/src/vs/workbench/api/browser/mainThreadNotebook.ts @@ -7,18 +7,18 @@ import { VSBuffer } from 'vs/base/common/buffer'; import { CancellationToken } from 'vs/base/common/cancellation'; import { Emitter } from 'vs/base/common/event'; import { DisposableStore, dispose, IDisposable } from 'vs/base/common/lifecycle'; +import { StopWatch } from 'vs/base/common/stopwatch'; +import { assertType } from 'vs/base/common/types'; import { URI } from 'vs/base/common/uri'; +import { CommandsRegistry } from 'vs/platform/commands/common/commands'; +import { ILogService } from 'vs/platform/log/common/log'; import { NotebookDto } from 'vs/workbench/api/browser/mainThreadNotebookDto'; -import { extHostNamedCustomer, IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; import { INotebookCellStatusBarService } from 'vs/workbench/contrib/notebook/common/notebookCellStatusBarService'; -import { INotebookCellStatusBarItemProvider, INotebookContributionData, NotebookData as NotebookData, NotebookExtensionDescription, TransientOptions } from 'vs/workbench/contrib/notebook/common/notebookCommon'; -import { INotebookContentProvider, INotebookService, SimpleNotebookProviderInfo } from 'vs/workbench/contrib/notebook/common/notebookService'; +import { INotebookCellStatusBarItemProvider, INotebookContributionData, NotebookData, NotebookExtensionDescription, TransientOptions } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { INotebookService, SimpleNotebookProviderInfo } from 'vs/workbench/contrib/notebook/common/notebookService'; +import { extHostNamedCustomer, IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'; import { SerializableObjectWithBuffers } from 'vs/workbench/services/extensions/common/proxyIdentifier'; import { ExtHostContext, ExtHostNotebookShape, MainContext, MainThreadNotebookShape } from '../common/extHost.protocol'; -import { ILogService } from 'vs/platform/log/common/log'; -import { StopWatch } from 'vs/base/common/stopwatch'; -import { CommandsRegistry } from 'vs/platform/commands/common/commands'; -import { assertType } from 'vs/base/common/types'; @extHostNamedCustomer(MainContext.MainThreadNotebook) export class MainThreadNotebooks implements MainThreadNotebookShape { @@ -26,7 +26,6 @@ export class MainThreadNotebooks implements MainThreadNotebookShape { private readonly _disposables = new DisposableStore(); private readonly _proxy: ExtHostNotebookShape; - private readonly _notebookProviders = new Map(); private readonly _notebookSerializer = new Map(); private readonly _notebookCellStatusBarRegistrations = new Map(); @@ -41,51 +40,9 @@ export class MainThreadNotebooks implements MainThreadNotebookShape { dispose(): void { this._disposables.dispose(); - // remove all notebook providers - for (const item of this._notebookProviders.values()) { - item.disposable.dispose(); - } dispose(this._notebookSerializer.values()); } - async $registerNotebookProvider(extension: NotebookExtensionDescription, viewType: string, options: TransientOptions, data: INotebookContributionData | undefined): Promise { - const contentOptions = { ...options }; - - const controller: INotebookContentProvider = { - get options() { - return contentOptions; - }, - set options(newOptions) { - contentOptions.transientCellMetadata = newOptions.transientCellMetadata; - contentOptions.transientDocumentMetadata = newOptions.transientDocumentMetadata; - contentOptions.transientOutputs = newOptions.transientOutputs; - }, - open: async (uri: URI, backupId: string | undefined, untitledDocumentData: VSBuffer | undefined, token: CancellationToken) => { - const data = await this._proxy.$openNotebook(viewType, uri, backupId, untitledDocumentData, token); - return { - data: NotebookDto.fromNotebookDataDto(data.value), - transientOptions: contentOptions - }; - }, - backup: async (uri: URI, token: CancellationToken) => '' - }; - - const disposable = new DisposableStore(); - disposable.add(this._notebookService.registerNotebookController(viewType, extension, controller)); - if (data) { - disposable.add(this._notebookService.registerContributedNotebookType(viewType, data)); - } - this._notebookProviders.set(viewType, { controller, disposable }); - } - - async $unregisterNotebookProvider(viewType: string): Promise { - const entry = this._notebookProviders.get(viewType); - if (entry) { - entry.disposable.dispose(); - this._notebookProviders.delete(viewType); - } - } - $registerNotebookSerializer(handle: number, extension: NotebookExtensionDescription, viewType: string, options: TransientOptions, data: INotebookContributionData | undefined): void { const registration = this._notebookService.registerNotebookSerializer(viewType, extension, { options, diff --git a/src/vs/workbench/api/common/extHost.api.impl.ts b/src/vs/workbench/api/common/extHost.api.impl.ts index 52cd8c59cb3..67cd07bbe39 100644 --- a/src/vs/workbench/api/common/extHost.api.impl.ts +++ b/src/vs/workbench/api/common/extHost.api.impl.ts @@ -937,14 +937,6 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I registerNotebookSerializer(viewType: string, serializer: vscode.NotebookSerializer, options?: vscode.NotebookDocumentContentOptions, registration?: vscode.NotebookRegistrationData) { return extHostNotebook.registerNotebookSerializer(extension, viewType, serializer, options, isProposedApiEnabled(extension, 'notebookLiveShare') ? registration : undefined); }, - registerNotebookContentProvider: (viewType: string, provider: vscode.NotebookContentProvider, options?: vscode.NotebookDocumentContentOptions, registration?: vscode.NotebookRegistrationData) => { - checkProposedApiEnabled(extension, 'notebookContentProvider'); - - extHostApiDeprecation.report('workspace.registerNotebookContentProvider', extension, - `The notebookContentProvider API is not on track for finalization and will be removed.`); - - return extHostNotebook.registerNotebookContentProvider(extension, viewType, provider, options); - }, onDidChangeConfiguration: (listener: (_: any) => any, thisArgs?: any, disposables?: extHostTypes.Disposable[]) => { return configProvider.onDidChangeConfiguration(listener, thisArgs, disposables); }, diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index 8b6a77a6e78..8236cc0a471 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -964,9 +964,6 @@ export interface INotebookCellStatusBarListDto { } export interface MainThreadNotebookShape extends IDisposable { - $registerNotebookProvider(extension: notebookCommon.NotebookExtensionDescription, viewType: string, options: notebookCommon.TransientOptions, registration: notebookCommon.INotebookContributionData | undefined): Promise; - $unregisterNotebookProvider(viewType: string): Promise; - $registerNotebookSerializer(handle: number, extension: notebookCommon.NotebookExtensionDescription, viewType: string, options: notebookCommon.TransientOptions, registration: notebookCommon.INotebookContributionData | undefined): void; $unregisterNotebookSerializer(handle: number): void; @@ -2063,8 +2060,6 @@ export interface ExtHostNotebookShape extends ExtHostNotebookDocumentsAndEditors $provideNotebookCellStatusBarItems(handle: number, uri: UriComponents, index: number, token: CancellationToken): Promise; $releaseNotebookCellStatusBarItems(id: number): void; - $openNotebook(viewType: string, uri: UriComponents, backupId: string | undefined, untitledDocumentData: VSBuffer | undefined, token: CancellationToken): Promise>; - $dataToNotebook(handle: number, data: VSBuffer, token: CancellationToken): Promise>; $notebookToData(handle: number, data: SerializableObjectWithBuffers, token: CancellationToken): Promise; } diff --git a/src/vs/workbench/api/common/extHostNotebook.ts b/src/vs/workbench/api/common/extHostNotebook.ts index bc4180dcd95..1b4063b5a0d 100644 --- a/src/vs/workbench/api/common/extHostNotebook.ts +++ b/src/vs/workbench/api/common/extHostNotebook.ts @@ -28,10 +28,6 @@ import { ExtHostCell, ExtHostNotebookDocument } from './extHostNotebookDocument' import { ExtHostNotebookEditor } from './extHostNotebookEditor'; -type NotebookContentProviderData = { - readonly provider: vscode.NotebookContentProvider; - readonly extension: IExtensionDescription; -}; export class ExtHostNotebookController implements ExtHostNotebookShape { private static _notebookStatusBarItemProviderHandlePool: number = 0; @@ -40,7 +36,6 @@ export class ExtHostNotebookController implements ExtHostNotebookShape { private readonly _notebookDocumentsProxy: MainThreadNotebookDocumentsShape; private readonly _notebookEditorsProxy: MainThreadNotebookEditorsShape; - private readonly _notebookContentProviders = new Map(); private readonly _notebookStatusBarItemProviders = new Map(); private readonly _documents = new ResourceMap(); private readonly _editors = new Map(); @@ -137,41 +132,7 @@ export class ExtHostNotebookController implements ExtHostNotebookShape { return result; } - private _getProviderData(viewType: string): NotebookContentProviderData { - const result = this._notebookContentProviders.get(viewType); - if (!result) { - throw new Error(`NO provider for '${viewType}'`); - } - return result; - } - registerNotebookContentProvider( - extension: IExtensionDescription, - viewType: string, - provider: vscode.NotebookContentProvider, - options?: vscode.NotebookDocumentContentOptions - ): vscode.Disposable { - if (isFalsyOrWhitespace(viewType)) { - throw new Error(`viewType cannot be empty or just whitespace`); - } - if (this._notebookContentProviders.has(viewType)) { - throw new Error(`Notebook provider for '${viewType}' already registered`); - } - - this._notebookContentProviders.set(viewType, { extension, provider }); - - this._notebookProxy.$registerNotebookProvider( - { id: extension.identifier, location: extension.extensionLocation }, - viewType, - typeConverters.NotebookDocumentContentOptions.from(options), - undefined, - ); - - return new extHostTypes.Disposable(() => { - this._notebookContentProviders.delete(viewType); - this._notebookProxy.$unregisterNotebookProvider(viewType); - }); - } private static _convertNotebookRegistrationData(extension: IExtensionDescription, registration: vscode.NotebookRegistrationData | undefined): INotebookContributionData | undefined { if (!registration) { @@ -341,14 +302,6 @@ export class ExtHostNotebookController implements ExtHostNotebookShape { // --- open, save, saveAs, backup - async $openNotebook(viewType: string, uri: UriComponents, backupId: string | undefined, untitledDocumentData: VSBuffer | undefined, token: CancellationToken): Promise> { - const { provider } = this._getProviderData(viewType); - const data = await provider.openNotebook(URI.revive(uri), { backupId, untitledDocumentData: untitledDocumentData?.buffer }, token); - return new SerializableObjectWithBuffers({ - metadata: data.metadata ?? Object.create(null), - cells: data.cells.map(typeConverters.NotebookCellData.from), - }); - } private _createExtHostEditor(document: ExtHostNotebookDocument, editorId: string, data: INotebookEditorAddData) { diff --git a/src/vs/workbench/api/test/browser/extHostNotebook.test.ts b/src/vs/workbench/api/test/browser/extHostNotebook.test.ts index 0a9c0def137..ea7551f5856 100644 --- a/src/vs/workbench/api/test/browser/extHostNotebook.test.ts +++ b/src/vs/workbench/api/test/browser/extHostNotebook.test.ts @@ -47,17 +47,15 @@ suite('NotebookCell#Document', function () { override $registerCommand() { } }); rpcProtocol.set(MainContext.MainThreadNotebook, new class extends mock() { - override async $registerNotebookProvider() { } - override async $unregisterNotebookProvider() { } + override async $registerNotebookSerializer() { } + override async $unregisterNotebookSerializer() { } }); extHostDocumentsAndEditors = new ExtHostDocumentsAndEditors(rpcProtocol, new NullLogService()); extHostDocuments = new ExtHostDocuments(rpcProtocol, extHostDocumentsAndEditors); extHostNotebooks = new ExtHostNotebookController(rpcProtocol, new ExtHostCommands(rpcProtocol, new NullLogService()), extHostDocumentsAndEditors, extHostDocuments); extHostNotebookDocuments = new ExtHostNotebookDocuments(extHostNotebooks); - const reg = extHostNotebooks.registerNotebookContentProvider(nullExtensionDescription, 'test', new class extends mock() { - // async openNotebook() { } - }); + const reg = extHostNotebooks.registerNotebookSerializer(nullExtensionDescription, 'test', new class extends mock() { }); extHostNotebooks.$acceptDocumentAndEditorsDelta(new SerializableObjectWithBuffers({ addedDocuments: [{ uri: notebookUri, diff --git a/src/vs/workbench/api/test/browser/extHostNotebookKernel.test.ts b/src/vs/workbench/api/test/browser/extHostNotebookKernel.test.ts index d159691ba03..c3c34868e18 100644 --- a/src/vs/workbench/api/test/browser/extHostNotebookKernel.test.ts +++ b/src/vs/workbench/api/test/browser/extHostNotebookKernel.test.ts @@ -83,8 +83,8 @@ suite('NotebookKernel', function () { }); rpcProtocol.set(MainContext.MainThreadNotebook, new class extends mock() { - override async $registerNotebookProvider() { } - override async $unregisterNotebookProvider() { } + override async $registerNotebookSerializer() { } + override async $unregisterNotebookSerializer() { } }); extHostDocumentsAndEditors = new ExtHostDocumentsAndEditors(rpcProtocol, new NullLogService()); extHostDocuments = new ExtHostDocuments(rpcProtocol, extHostDocumentsAndEditors); diff --git a/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts b/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts index 1b78f885ba3..bb855ef7455 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts @@ -1246,7 +1246,7 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditorD } if (!this._webview) { - this._createWebview(this.getId(), this.textModel.viewType, this.textModel.uri); + this._ensureWebview(this.getId(), this.textModel.viewType, this.textModel.uri); } this._webviewResolvePromise = (async () => { @@ -1283,7 +1283,11 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditorD return this._webviewResolvePromise; } - private async _createWebview(id: string, viewType: string, resource: URI): Promise { + private _ensureWebview(id: string, viewType: string, resource: URI) { + if (this._webview) { + return; + } + const that = this; this._webview = this.instantiationService.createInstance(BackLayerWebView, { @@ -1316,7 +1320,8 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditorD } private async _attachModel(textModel: NotebookTextModel, viewState: INotebookEditorViewState | undefined, perf?: NotebookPerfMarks) { - await this._createWebview(this.getId(), textModel.viewType, textModel.uri); + this._ensureWebview(this.getId(), textModel.viewType, textModel.uri); + this.viewModel = this.instantiationService.createInstance(NotebookViewModel, textModel.viewType, textModel, this._viewContext, this.getLayoutInfo(), { isReadOnly: this._readOnly }); this._viewContext.eventDispatcher.emit([new NotebookLayoutChangedEvent({ width: true, fontInfo: true }, this.getLayoutInfo())]); diff --git a/src/vs/workbench/services/extensions/common/extensionsApiProposals.ts b/src/vs/workbench/services/extensions/common/extensionsApiProposals.ts index fc3c907c52f..533692c95d0 100644 --- a/src/vs/workbench/services/extensions/common/extensionsApiProposals.ts +++ b/src/vs/workbench/services/extensions/common/extensionsApiProposals.ts @@ -40,7 +40,6 @@ export const allApiProposals = Object.freeze({ interactiveWindow: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.interactiveWindow.d.ts', ipc: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.ipc.d.ts', notebookCellExecutionState: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.notebookCellExecutionState.d.ts', - notebookContentProvider: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.notebookContentProvider.d.ts', notebookControllerAffinityHidden: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.notebookControllerAffinityHidden.d.ts', notebookControllerKind: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.notebookControllerKind.d.ts', notebookDeprecated: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.notebookDeprecated.d.ts', diff --git a/src/vscode-dts/vscode.proposed.notebookContentProvider.d.ts b/src/vscode-dts/vscode.proposed.notebookContentProvider.d.ts deleted file mode 100644 index d336c2ccf54..00000000000 --- a/src/vscode-dts/vscode.proposed.notebookContentProvider.d.ts +++ /dev/null @@ -1,35 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -declare module 'vscode' { - - // https://github.com/microsoft/vscode/issues/147248 - - /** @deprecated */ - interface NotebookDocumentOpenContext { - readonly backupId?: string; - readonly untitledDocumentData?: Uint8Array; - } - - // todo@API use openNotebookDOCUMENT to align with openCustomDocument etc? - // todo@API rename to NotebookDocumentContentProvider - /** @deprecated */ - export interface NotebookContentProvider { - - /** - * Content providers should always use {@link FileSystemProvider file system providers} to - * resolve the raw content for `uri` as the resource is not necessarily a file on disk. - */ - openNotebook(uri: Uri, openContext: NotebookDocumentOpenContext, token: CancellationToken): NotebookData | Thenable; - } - - export namespace workspace { - - // TODO@api use NotebookDocumentFilter instead of just notebookType:string? - // TODO@API options duplicates the more powerful variant on NotebookContentProvider - /** @deprecated */ - export function registerNotebookContentProvider(notebookType: string, provider: NotebookContentProvider, options?: NotebookDocumentContentOptions): Disposable; - } -} From c7330bb771d5e77ac2db9ba962e91cca8962e254 Mon Sep 17 00:00:00 2001 From: rebornix Date: Tue, 1 Nov 2022 20:15:42 -0700 Subject: [PATCH 037/185] Notebook find widget and toolbar css variable. --- .../find/notebookFindReplaceWidget.css | 10 ++++++ .../contrib/find/notebookFindReplaceWidget.ts | 35 +------------------ .../browser/media/notebookToolbar.css | 2 +- .../viewParts/notebookEditorToolbar.ts | 13 ------- 4 files changed, 12 insertions(+), 48 deletions(-) diff --git a/src/vs/workbench/contrib/notebook/browser/contrib/find/notebookFindReplaceWidget.css b/src/vs/workbench/contrib/notebook/browser/contrib/find/notebookFindReplaceWidget.css index 52cfc8adcac..083fb5197c2 100644 --- a/src/vs/workbench/contrib/notebook/browser/contrib/find/notebookFindReplaceWidget.css +++ b/src/vs/workbench/contrib/notebook/browser/contrib/find/notebookFindReplaceWidget.css @@ -14,6 +14,9 @@ padding:0 var(--notebook-find-horizontal-padding); transition: top 200ms linear; visibility: hidden; + background-color: var(--vscode-editorWidget-background) !important; + color: var(--vscode-editorWidget-foreground); + box-shadow: 0 0 8px 2px var(--vscode-widget-shadow); } .monaco-workbench.reduce-motion .simple-fr-find-part-wrapper { @@ -154,10 +157,17 @@ padding: 2px; } +.simple-fr-find-part .find-filter-button > .monaco-action-bar .action-label.notebook-filters.checked { + border-color: var(--vscode-inputOption-activeBorder); + color: var(--vscode-inputOption-activeForeground); + background-color: var(--vscode-inputOption-activeBackground); +} + .monaco-workbench .simple-fr-find-part .monaco-inputbox > .ibwrapper > .input, .monaco-workbench .simple-fr-replace-part .monaco-inputbox > .ibwrapper > .input { height: 24px; } .monaco-workbench .simple-fr-find-part-wrapper .monaco-sash { left: 0 !important; + background-color: var(--vscode-editorWidget-resizeBorder, var(--vscode-editorWidget-border)); } diff --git a/src/vs/workbench/contrib/notebook/browser/contrib/find/notebookFindReplaceWidget.ts b/src/vs/workbench/contrib/notebook/browser/contrib/find/notebookFindReplaceWidget.ts index 736a6f2eb1e..f27f0505e87 100644 --- a/src/vs/workbench/contrib/notebook/browser/contrib/find/notebookFindReplaceWidget.ts +++ b/src/vs/workbench/contrib/notebook/browser/contrib/find/notebookFindReplaceWidget.ts @@ -18,7 +18,7 @@ import * as nls from 'vs/nls'; import { ContextScopedReplaceInput, registerAndCreateHistoryNavigationContext } from 'vs/platform/history/browser/contextScopedHistoryWidget'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IContextMenuService, IContextViewService } from 'vs/platform/contextview/browser/contextView'; -import { editorWidgetBackground, editorWidgetBorder, editorWidgetForeground, editorWidgetResizeBorder, inputActiveOptionBackground, inputActiveOptionBorder, inputActiveOptionForeground, inputBackground, inputBorder, inputForeground, inputValidationErrorBackground, inputValidationErrorBorder, inputValidationErrorForeground, inputValidationInfoBackground, inputValidationInfoBorder, inputValidationInfoForeground, inputValidationWarningBackground, inputValidationWarningBorder, inputValidationWarningForeground, widgetShadow } from 'vs/platform/theme/common/colorRegistry'; +import { inputActiveOptionBackground, inputActiveOptionBorder, inputActiveOptionForeground, inputBackground, inputBorder, inputForeground, inputValidationErrorBackground, inputValidationErrorBorder, inputValidationErrorForeground, inputValidationInfoBackground, inputValidationInfoBorder, inputValidationInfoForeground, inputValidationWarningBackground, inputValidationWarningBorder, inputValidationWarningForeground } from 'vs/platform/theme/common/colorRegistry'; import { registerIcon, widgetClose } from 'vs/platform/theme/common/iconRegistry'; import { attachProgressBarStyler } from 'vs/platform/theme/common/styler'; import { IColorTheme, IThemeService, registerThemingParticipant, ThemeIcon } from 'vs/platform/theme/common/themeService'; @@ -766,39 +766,6 @@ export abstract class SimpleFindReplaceWidget extends Widget { // theming registerThemingParticipant((theme, collector) => { - const findWidgetBGColor = theme.getColor(editorWidgetBackground); - if (findWidgetBGColor) { - collector.addRule(`.monaco-workbench .simple-fr-find-part-wrapper { background-color: ${findWidgetBGColor} !important; }`); - } - - const widgetForeground = theme.getColor(editorWidgetForeground); - if (widgetForeground) { - collector.addRule(`.monaco-workbench .simple-fr-find-part-wrapper { color: ${widgetForeground}; }`); - } - - const widgetShadowColor = theme.getColor(widgetShadow); - if (widgetShadowColor) { - collector.addRule(`.monaco-workbench .simple-fr-find-part-wrapper { box-shadow: 0 0 8px 2px ${widgetShadowColor}; }`); - } - - const inputActiveOptionBorderColor = theme.getColor(inputActiveOptionBorder); - if (inputActiveOptionBorderColor) { - collector.addRule(`.simple-fr-find-part .find-filter-button > .monaco-action-bar .action-label.notebook-filters.checked { border-color: ${inputActiveOptionBorderColor}; }`); - } - const inputActiveOptionForegroundColor = theme.getColor(inputActiveOptionForeground); - if (inputActiveOptionForegroundColor) { - collector.addRule(`.simple-fr-find-part .find-filter-button > .monaco-action-bar .action-label.notebook-filters.checked { color: ${inputActiveOptionForegroundColor}; }`); - } - const inputActiveOptionBackgroundColor = theme.getColor(inputActiveOptionBackground); - if (inputActiveOptionBackgroundColor) { - collector.addRule(`.simple-fr-find-part .find-filter-button > .monaco-action-bar .action-label.notebook-filters.checked { background-color: ${inputActiveOptionBackgroundColor}; }`); - } - - const resizeBorderBackground = theme.getColor(editorWidgetResizeBorder) ?? theme.getColor(editorWidgetBorder); - if (resizeBorderBackground) { - collector.addRule(`.monaco-workbench .simple-fr-find-part-wrapper .monaco-sash { background-color: ${resizeBorderBackground}; }`); - } - collector.addRule(` :root { --notebook-find-width: ${NOTEBOOK_FIND_WIDGET_INITIAL_WIDTH}px; diff --git a/src/vs/workbench/contrib/notebook/browser/media/notebookToolbar.css b/src/vs/workbench/contrib/notebook/browser/media/notebookToolbar.css index f7ddb6665a7..5413489266c 100644 --- a/src/vs/workbench/contrib/notebook/browser/media/notebookToolbar.css +++ b/src/vs/workbench/contrib/notebook/browser/media/notebookToolbar.css @@ -78,7 +78,7 @@ } .monaco-workbench .notebookOverlay .notebook-toolbar-container .monaco-action-bar:not(.vertical) .action-item.active { - background-color: unset; + background-color: var(--vscode-toolbar-activeBackground); } .monaco-workbench .notebookOverlay .notebook-toolbar-container .monaco-action-bar .action-item .codicon-notebook-state-error { diff --git a/src/vs/workbench/contrib/notebook/browser/viewParts/notebookEditorToolbar.ts b/src/vs/workbench/contrib/notebook/browser/viewParts/notebookEditorToolbar.ts index 18abfa18c17..49779ff74eb 100644 --- a/src/vs/workbench/contrib/notebook/browser/viewParts/notebookEditorToolbar.ts +++ b/src/vs/workbench/contrib/notebook/browser/viewParts/notebookEditorToolbar.ts @@ -17,8 +17,6 @@ import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; -import { toolbarActiveBackground } from 'vs/platform/theme/common/colorRegistry'; -import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { SELECT_KERNEL_ID } from 'vs/workbench/contrib/notebook/browser/controller/coreActions'; import { NOTEBOOK_EDITOR_ID, NotebookSetting } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { INotebookEditorDelegate } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; @@ -620,14 +618,3 @@ export class NotebookEditorToolbar extends Disposable { super.dispose(); } } - -registerThemingParticipant((theme, collector) => { - const toolbarActiveBackgroundColor = theme.getColor(toolbarActiveBackground); - if (toolbarActiveBackgroundColor) { - collector.addRule(` - .monaco-workbench .notebookOverlay .notebook-toolbar-container .monaco-action-bar:not(.vertical) .action-item.active { - background-color: ${toolbarActiveBackgroundColor}; - } - `); - } -}); From abfb1f679b4685e0332c9f6d5e2bf172c5423564 Mon Sep 17 00:00:00 2001 From: rebornix Date: Tue, 1 Nov 2022 20:23:46 -0700 Subject: [PATCH 038/185] Cell comments css variables --- .../notebook/browser/media/notebook.css | 18 ++++++++++ .../browser/view/cellParts/cellComments.ts | 34 +++++-------------- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/src/vs/workbench/contrib/notebook/browser/media/notebook.css b/src/vs/workbench/contrib/notebook/browser/media/notebook.css index 5ab3a43366f..0a0c0c97b22 100644 --- a/src/vs/workbench/contrib/notebook/browser/media/notebook.css +++ b/src/vs/workbench/contrib/notebook/browser/media/notebook.css @@ -551,3 +551,21 @@ .monaco-workbench .notebookOverlay .cell-editor-container .monaco-editor .margin-view-overlays .codicon-folding-collapsed { margin-left: 0; } + +/** Notebook Cell Comments */ + +.cell-comment-container.review-widget { + border-left: 1px solid var(--vscode-peekView-border); border-right: 1px solid var(--vscode-peekView-border); +} + +.cell-comment-container.review-widget > .head { + border-top: 1px solid var(--vscode-peekView-border); +} + +.cell-comment-container.review-widget > .body { + border-bottom: 1px solid var(--vscode-peekView-border); +} + +.cell-comment-container.review-widget { + background-color: var(--vscode-peekViewResult-background); +} diff --git a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellComments.ts b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellComments.ts index d18b4c332a0..b4bc5a482a3 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellComments.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellComments.ts @@ -3,22 +3,21 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import { coalesce } from 'vs/base/common/arrays'; +import { DisposableStore } from 'vs/base/common/lifecycle'; +import { EDITOR_FONT_DEFAULTS, IEditorOptions } from 'vs/editor/common/config/editorOptions'; import * as languages from 'vs/editor/common/languages'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { IThemeService } from 'vs/platform/theme/common/themeService'; +import { ICommentService } from 'vs/workbench/contrib/comments/browser/commentService'; +import { CommentThreadWidget } from 'vs/workbench/contrib/comments/browser/commentThreadWidget'; import { ICellViewModel, INotebookEditorDelegate } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { CellPart } from 'vs/workbench/contrib/notebook/browser/view/cellPart'; -import { CellKind } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { CodeCellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/codeCellViewModel'; -import { CommentThreadWidget } from 'vs/workbench/contrib/comments/browser/commentThreadWidget'; -import { DisposableStore } from 'vs/base/common/lifecycle'; -import { IThemeService, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; +import { CellKind } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { ICellRange } from 'vs/workbench/contrib/notebook/common/notebookRange'; -import { ICommentService } from 'vs/workbench/contrib/comments/browser/commentService'; -import { coalesce } from 'vs/base/common/arrays'; -import { peekViewBorder, peekViewResultsBackground } from 'vs/editor/contrib/peekView/browser/peekView'; -import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { EDITOR_FONT_DEFAULTS, IEditorOptions } from 'vs/editor/common/config/editorOptions'; export class CellComments extends CellPart { private _initialized: boolean = false; @@ -176,20 +175,3 @@ export class CellComments extends CellPart { } } -registerThemingParticipant((theme, collector) => { - const borderColor = theme.getColor(peekViewBorder); - - if (borderColor) { - collector.addRule(`.cell-comment-container.review-widget { border-left: 1px solid ${borderColor}; border-right: 1px solid ${borderColor}; }`); - collector.addRule(`.cell-comment-container.review-widget > .head { border-top: 1px solid ${borderColor}; }`); - collector.addRule(`.cell-comment-container.review-widget > .body { border-bottom: 1px solid ${borderColor}; }`); - } - - const peekViewBackground = theme.getColor(peekViewResultsBackground); - if (peekViewBackground) { - collector.addRule( - `.cell-comment-container.review-widget {` + - ` background-color: ${peekViewBackground};` + - `}`); - } -}); From c51c91e232d9d90a63c95d7b930e111f3612a12e Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Tue, 1 Nov 2022 20:29:22 -0700 Subject: [PATCH 039/185] Typo: folding controller. (#165211) --- .../contrib/notebook/browser/controller/foldingController.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/notebook/browser/controller/foldingController.ts b/src/vs/workbench/contrib/notebook/browser/controller/foldingController.ts index a9989ca21d1..0af3a8546ce 100644 --- a/src/vs/workbench/contrib/notebook/browser/controller/foldingController.ts +++ b/src/vs/workbench/contrib/notebook/browser/controller/foldingController.ts @@ -23,7 +23,7 @@ import { ICommandHandlerDescription } from 'vs/platform/commands/common/commands import { NotebookViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookViewModelImpl'; export class FoldingController extends Disposable implements INotebookEditorContribution { - static id: string = 'workbench.notebook.findController'; + static id: string = 'workbench.notebook.foldingController'; private _foldingModel: FoldingModel | null = null; private readonly _localStore = this._register(new DisposableStore()); From 28cf111d771a0e9c66534e713224ab4f2b828541 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Tue, 1 Nov 2022 22:12:15 -0700 Subject: [PATCH 040/185] Don't clear the pause reason for other threads when processing a stopped event with allThreadsStopped=true (#165180) Fix #165032 --- .../contrib/debug/browser/debugSession.ts | 2 +- .../debug/test/browser/baseDebugView.test.ts | 6 +- .../debug/test/browser/breakpoints.test.ts | 6 +- .../debug/test/browser/callStack.test.ts | 87 +++++++++++++++---- .../test/browser/debugANSIHandling.test.ts | 4 +- .../debug/test/browser/debugHover.test.ts | 4 +- .../contrib/debug/test/browser/repl.test.ts | 24 ++--- 7 files changed, 93 insertions(+), 40 deletions(-) diff --git a/src/vs/workbench/contrib/debug/browser/debugSession.ts b/src/vs/workbench/contrib/debug/browser/debugSession.ts index 019914c4f65..55e3c5561c1 100644 --- a/src/vs/workbench/contrib/debug/browser/debugSession.ts +++ b/src/vs/workbench/contrib/debug/browser/debugSession.ts @@ -889,7 +889,7 @@ export class DebugSession implements IDebugSession { // whether the thread is stopped or not if (stoppedDetails.allThreadsStopped) { this.threads.forEach(thread => { - thread.stoppedDetails = thread.threadId === stoppedDetails.threadId ? stoppedDetails : { reason: undefined }; + thread.stoppedDetails = thread.threadId === stoppedDetails.threadId ? stoppedDetails : { reason: thread.stoppedDetails?.reason }; thread.stopped = true; thread.clearCallStack(); }); diff --git a/src/vs/workbench/contrib/debug/test/browser/baseDebugView.test.ts b/src/vs/workbench/contrib/debug/test/browser/baseDebugView.test.ts index a6169299daa..a9aa1064ae8 100644 --- a/src/vs/workbench/contrib/debug/test/browser/baseDebugView.test.ts +++ b/src/vs/workbench/contrib/debug/test/browser/baseDebugView.test.ts @@ -11,7 +11,7 @@ import { HighlightedLabel } from 'vs/base/browser/ui/highlightedlabel/highlighte import { LinkDetector } from 'vs/workbench/contrib/debug/browser/linkDetector'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; import { workbenchInstantiationService } from 'vs/workbench/test/browser/workbenchTestServices'; -import { createMockSession } from 'vs/workbench/contrib/debug/test/browser/callStack.test'; +import { createTestSession } from 'vs/workbench/contrib/debug/test/browser/callStack.test'; import { isStatusbarInDebugMode } from 'vs/workbench/contrib/debug/browser/statusbarColorProvider'; import { State } from 'vs/workbench/contrib/debug/common/debug'; import { isWindows } from 'vs/base/common/platform'; @@ -132,8 +132,8 @@ suite('Debug - Base Debug View', () => { test('statusbar in debug mode', () => { const model = createMockDebugModel(); - const session = createMockSession(model); - const session2 = createMockSession(model, undefined, { suppressDebugStatusbar: true }); + const session = createTestSession(model); + const session2 = createTestSession(model, undefined, { suppressDebugStatusbar: true }); assert.strictEqual(isStatusbarInDebugMode(State.Inactive, []), false); assert.strictEqual(isStatusbarInDebugMode(State.Initializing, [session]), false); assert.strictEqual(isStatusbarInDebugMode(State.Running, [session]), true); diff --git a/src/vs/workbench/contrib/debug/test/browser/breakpoints.test.ts b/src/vs/workbench/contrib/debug/test/browser/breakpoints.test.ts index 8dd479109dd..7b4679bdd73 100644 --- a/src/vs/workbench/contrib/debug/test/browser/breakpoints.test.ts +++ b/src/vs/workbench/contrib/debug/test/browser/breakpoints.test.ts @@ -14,7 +14,7 @@ import { createBreakpointDecorations } from 'vs/workbench/contrib/debug/browser/ import { OverviewRulerLane } from 'vs/editor/common/model'; import { MarkdownString } from 'vs/base/common/htmlContent'; import { createTextModel } from 'vs/editor/test/common/testTextModel'; -import { createMockSession } from 'vs/workbench/contrib/debug/test/browser/callStack.test'; +import { createTestSession } from 'vs/workbench/contrib/debug/test/browser/callStack.test'; import { createMockDebugModel, MockDebugService } from 'vs/workbench/contrib/debug/test/browser/mockDebug'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; import { ILanguageService } from 'vs/editor/common/languages/language'; @@ -174,7 +174,7 @@ suite('Debug - Breakpoints', () => { const modelUri = uri.file('/myfolder/myfile.js'); addBreakpointsAndCheckEvents(model, modelUri, [{ lineNumber: 5, enabled: true, condition: 'x > 5' }, { lineNumber: 10, enabled: false }]); const breakpoints = model.getBreakpoints(); - const session = createMockSession(model); + const session = createTestSession(model); const data = new Map(); assert.strictEqual(breakpoints[0].lineNumber, 5); @@ -186,7 +186,7 @@ suite('Debug - Breakpoints', () => { assert.strictEqual(breakpoints[0].lineNumber, 5); assert.strictEqual(breakpoints[1].lineNumber, 50); - const session2 = createMockSession(model); + const session2 = createTestSession(model); const data2 = new Map(); data2.set(breakpoints[0].getId(), { verified: true, line: 100 }); data2.set(breakpoints[1].getId(), { verified: true, line: 500 }); diff --git a/src/vs/workbench/contrib/debug/test/browser/callStack.test.ts b/src/vs/workbench/contrib/debug/test/browser/callStack.test.ts index dfa763ce7cf..c666a3d03d3 100644 --- a/src/vs/workbench/contrib/debug/test/browser/callStack.test.ts +++ b/src/vs/workbench/contrib/debug/test/browser/callStack.test.ts @@ -29,7 +29,7 @@ const mockWorkspaceContextService = { } } as any; -export function createMockSession(model: DebugModel, name = 'mockSession', options?: IDebugSessionOptions): DebugSession { +export function createTestSession(model: DebugModel, name = 'mockSession', options?: IDebugSessionOptions): DebugSession { return new DebugSession(generateUuid(), { resolved: { name, type: 'node', request: 'launch' }, unresolved: undefined }, undefined!, model, options, { getViewModel(): any { return { @@ -79,7 +79,7 @@ suite('Debug - CallStack', () => { test('threads simple', () => { const threadId = 1; const threadName = 'firstThread'; - const session = createMockSession(model); + const session = createTestSession(model); model.addSession(session); assert.strictEqual(model.getSessions(true).length, 1); @@ -98,7 +98,7 @@ suite('Debug - CallStack', () => { assert.strictEqual(model.getSessions(true).length, 1); }); - test('threads multiple wtih allThreadsStopped', async () => { + test('threads multiple with allThreadsStopped', async () => { const threadId1 = 1; const threadName1 = 'firstThread'; const threadId2 = 2; @@ -106,7 +106,7 @@ suite('Debug - CallStack', () => { const stoppedReason = 'breakpoint'; // Add the threads - const session = createMockSession(model); + const session = createTestSession(model); model.addSession(session); session['raw'] = rawSession; @@ -178,7 +178,60 @@ suite('Debug - CallStack', () => { assert.strictEqual(session.getAllThreads().length, 0); }); - test('threads mutltiple without allThreadsStopped', async () => { + test('allThreadsStopped in multiple events', async () => { + const threadId1 = 1; + const threadName1 = 'firstThread'; + const threadId2 = 2; + const threadName2 = 'secondThread'; + const stoppedReason = 'breakpoint'; + + // Add the threads + const session = createTestSession(model); + model.addSession(session); + + session['raw'] = rawSession; + + // Stopped event with all threads stopped + model.rawUpdate({ + sessionId: session.getId(), + threads: [{ + id: threadId1, + name: threadName1 + }, { + id: threadId2, + name: threadName2 + }], + stoppedDetails: { + reason: stoppedReason, + threadId: threadId1, + allThreadsStopped: true + }, + }); + + model.rawUpdate({ + sessionId: session.getId(), + threads: [{ + id: threadId1, + name: threadName1 + }, { + id: threadId2, + name: threadName2 + }], + stoppedDetails: { + reason: stoppedReason, + threadId: threadId2, + allThreadsStopped: true + }, + }); + + const thread1 = session.getThread(threadId1)!; + const thread2 = session.getThread(threadId2)!; + + assert.strictEqual(thread1.stoppedDetails?.reason, stoppedReason); + assert.strictEqual(thread2.stoppedDetails?.reason, stoppedReason); + }); + + test('threads multiple without allThreadsStopped', async () => { const sessionStub = sinon.spy(rawSession, 'stackTrace'); const stoppedThreadId = 1; @@ -186,7 +239,7 @@ suite('Debug - CallStack', () => { const runningThreadId = 2; const runningThreadName = 'runningThread'; const stoppedReason = 'breakpoint'; - const session = createMockSession(model); + const session = createTestSession(model); model.addSession(session); session['raw'] = rawSession; @@ -258,7 +311,7 @@ suite('Debug - CallStack', () => { }); test('stack frame get specific source name', () => { - const session = createMockSession(model); + const session = createTestSession(model); model.addSession(session); const { firstStackFrame, secondStackFrame } = createTwoStackFrames(session); @@ -267,7 +320,7 @@ suite('Debug - CallStack', () => { }); test('stack frame toString()', () => { - const session = createMockSession(model); + const session = createTestSession(model); const thread = new Thread(session, 'mockthread', 1); const firstSource = new Source({ name: 'internalModule.js', @@ -283,17 +336,17 @@ suite('Debug - CallStack', () => { }); test('debug child sessions are added in correct order', () => { - const session = createMockSession(model); + const session = createTestSession(model); model.addSession(session); - const secondSession = createMockSession(model, 'mockSession2'); + const secondSession = createTestSession(model, 'mockSession2'); model.addSession(secondSession); - const firstChild = createMockSession(model, 'firstChild', { parentSession: session }); + const firstChild = createTestSession(model, 'firstChild', { parentSession: session }); model.addSession(firstChild); - const secondChild = createMockSession(model, 'secondChild', { parentSession: session }); + const secondChild = createTestSession(model, 'secondChild', { parentSession: session }); model.addSession(secondChild); - const thirdSession = createMockSession(model, 'mockSession3'); + const thirdSession = createTestSession(model, 'mockSession3'); model.addSession(thirdSession); - const anotherChild = createMockSession(model, 'secondChild', { parentSession: secondSession }); + const anotherChild = createTestSession(model, 'secondChild', { parentSession: secondSession }); model.addSession(anotherChild); const sessions = model.getSessions(); @@ -306,7 +359,7 @@ suite('Debug - CallStack', () => { }); test('decorations', () => { - const session = createMockSession(model); + const session = createTestSession(model); model.addSession(session); const { firstStackFrame, secondStackFrame } = createTwoStackFrames(session); let decorations = createDecorationsForStackFrame(firstStackFrame, true, false); @@ -338,7 +391,7 @@ suite('Debug - CallStack', () => { }); test('contexts', () => { - const session = createMockSession(model); + const session = createTestSession(model); model.addSession(session); const { firstStackFrame, secondStackFrame } = createTwoStackFrames(session); let context = getContext(firstStackFrame); @@ -378,7 +431,7 @@ suite('Debug - CallStack', () => { } }(generateUuid(), { resolved: { name: 'stoppedSession', type: 'node', request: 'launch' }, unresolved: undefined }, undefined!, model, undefined, undefined!, undefined!, undefined!, undefined!, undefined!, mockWorkspaceContextService, undefined!, undefined!, undefined!, mockUriIdentityService, new TestInstantiationService(), undefined!, undefined!); - const runningSession = createMockSession(model); + const runningSession = createTestSession(model); model.addSession(runningSession); model.addSession(session); diff --git a/src/vs/workbench/contrib/debug/test/browser/debugANSIHandling.test.ts b/src/vs/workbench/contrib/debug/test/browser/debugANSIHandling.test.ts index f551035fd81..c59f6f45bf2 100644 --- a/src/vs/workbench/contrib/debug/test/browser/debugANSIHandling.test.ts +++ b/src/vs/workbench/contrib/debug/test/browser/debugANSIHandling.test.ts @@ -16,7 +16,7 @@ import { ansiColorMap } from 'vs/workbench/contrib/terminal/common/terminalColor import { DebugModel } from 'vs/workbench/contrib/debug/common/debugModel'; import { DebugSession } from 'vs/workbench/contrib/debug/browser/debugSession'; import { createMockDebugModel } from 'vs/workbench/contrib/debug/test/browser/mockDebug'; -import { createMockSession } from 'vs/workbench/contrib/debug/test/browser/callStack.test'; +import { createTestSession } from 'vs/workbench/contrib/debug/test/browser/callStack.test'; import { DisposableStore } from 'vs/base/common/lifecycle'; suite('Debug - ANSI Handling', () => { @@ -33,7 +33,7 @@ suite('Debug - ANSI Handling', () => { setup(() => { disposables = new DisposableStore(); model = createMockDebugModel(); - session = createMockSession(model); + session = createTestSession(model); const instantiationService: TestInstantiationService = workbenchInstantiationService(undefined, disposables); linkDetector = instantiationService.createInstance(LinkDetector); diff --git a/src/vs/workbench/contrib/debug/test/browser/debugHover.test.ts b/src/vs/workbench/contrib/debug/test/browser/debugHover.test.ts index 4a0ed4554be..8a8524338fb 100644 --- a/src/vs/workbench/contrib/debug/test/browser/debugHover.test.ts +++ b/src/vs/workbench/contrib/debug/test/browser/debugHover.test.ts @@ -5,7 +5,7 @@ import * as assert from 'assert'; import { findExpressionInStackFrame } from 'vs/workbench/contrib/debug/browser/debugHover'; -import { createMockSession } from 'vs/workbench/contrib/debug/test/browser/callStack.test'; +import { createTestSession } from 'vs/workbench/contrib/debug/test/browser/callStack.test'; import { StackFrame, Thread, Scope, Variable } from 'vs/workbench/contrib/debug/common/debugModel'; import { Source } from 'vs/workbench/contrib/debug/common/debugSource'; import type { IScope, IExpression } from 'vs/workbench/contrib/debug/common/debug'; @@ -14,7 +14,7 @@ import { createMockDebugModel, mockUriIdentityService } from 'vs/workbench/contr suite('Debug - Hover', () => { test('find expression in stack frame', async () => { const model = createMockDebugModel(); - const session = createMockSession(model); + const session = createTestSession(model); const thread = new class extends Thread { public override getCallStack(): StackFrame[] { diff --git a/src/vs/workbench/contrib/debug/test/browser/repl.test.ts b/src/vs/workbench/contrib/debug/test/browser/repl.test.ts index acad5c358bb..dc7a10f45ac 100644 --- a/src/vs/workbench/contrib/debug/test/browser/repl.test.ts +++ b/src/vs/workbench/contrib/debug/test/browser/repl.test.ts @@ -11,7 +11,7 @@ import { MockRawSession, MockDebugAdapter, createMockDebugModel } from 'vs/workb import { SimpleReplElement, RawObjectReplElement, ReplEvaluationInput, ReplModel, ReplEvaluationResult, ReplGroup } from 'vs/workbench/contrib/debug/common/replModel'; import { RawDebugSession } from 'vs/workbench/contrib/debug/browser/rawDebugSession'; import { timeout } from 'vs/base/common/async'; -import { createMockSession } from 'vs/workbench/contrib/debug/test/browser/callStack.test'; +import { createTestSession } from 'vs/workbench/contrib/debug/test/browser/callStack.test'; import { ReplFilter } from 'vs/workbench/contrib/debug/browser/replFilter'; import { TreeVisibility } from 'vs/base/browser/ui/tree/tree'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; @@ -27,7 +27,7 @@ suite('Debug - REPL', () => { }); test('repl output', () => { - const session = createMockSession(model); + const session = createTestSession(model); const repl = new ReplModel(configurationService); repl.appendToRepl(session, 'first line\n', severity.Error); repl.appendToRepl(session, 'second line ', severity.Error); @@ -85,7 +85,7 @@ suite('Debug - REPL', () => { }); test('repl output count', () => { - const session = createMockSession(model); + const session = createTestSession(model); const repl = new ReplModel(configurationService); repl.appendToRepl(session, 'first line\n', severity.Info); repl.appendToRepl(session, 'first line\n', severity.Info); @@ -107,11 +107,11 @@ suite('Debug - REPL', () => { test('repl merging', () => { // 'mergeWithParent' should be ignored when there is no parent. - const parent = createMockSession(model, 'parent', { repl: 'mergeWithParent' }); - const child1 = createMockSession(model, 'child1', { parentSession: parent, repl: 'separate' }); - const child2 = createMockSession(model, 'child2', { parentSession: parent, repl: 'mergeWithParent' }); - const grandChild = createMockSession(model, 'grandChild', { parentSession: child2, repl: 'mergeWithParent' }); - const child3 = createMockSession(model, 'child3', { parentSession: parent }); + const parent = createTestSession(model, 'parent', { repl: 'mergeWithParent' }); + const child1 = createTestSession(model, 'child1', { parentSession: parent, repl: 'separate' }); + const child2 = createTestSession(model, 'child2', { parentSession: parent, repl: 'mergeWithParent' }); + const grandChild = createTestSession(model, 'grandChild', { parentSession: child2, repl: 'mergeWithParent' }); + const child3 = createTestSession(model, 'child3', { parentSession: parent }); let parentChanges = 0; parent.onDidChangeReplElements(() => ++parentChanges); @@ -150,7 +150,7 @@ suite('Debug - REPL', () => { }); test('repl expressions', () => { - const session = createMockSession(model); + const session = createTestSession(model); assert.strictEqual(session.getReplElements().length, 0); model.addSession(session); @@ -172,7 +172,7 @@ suite('Debug - REPL', () => { }); test('repl ordering', async () => { - const session = createMockSession(model); + const session = createTestSession(model); model.addSession(session); const adapter = new MockDebugAdapter(); @@ -194,7 +194,7 @@ suite('Debug - REPL', () => { }); test('repl groups', async () => { - const session = createMockSession(model); + const session = createTestSession(model); const repl = new ReplModel(configurationService); repl.appendToRepl(session, 'first global line', severity.Info); @@ -232,7 +232,7 @@ suite('Debug - REPL', () => { }); test('repl filter', async () => { - const session = createMockSession(model); + const session = createTestSession(model); const repl = new ReplModel(configurationService); const replFilter = new ReplFilter(); From 19ca0198456d0f9eb47287da14db0838d1464bae Mon Sep 17 00:00:00 2001 From: rebornix Date: Tue, 1 Nov 2022 22:17:30 -0700 Subject: [PATCH 041/185] Diff overview ruler css variables --- .../notebook/browser/diff/notebookDiff.css | 12 +++++++ .../browser/diff/notebookDiffOverviewRuler.ts | 33 ++----------------- 2 files changed, 14 insertions(+), 31 deletions(-) diff --git a/src/vs/workbench/contrib/notebook/browser/diff/notebookDiff.css b/src/vs/workbench/contrib/notebook/browser/diff/notebookDiff.css index bb6786c48c2..d8bd1615fb1 100644 --- a/src/vs/workbench/contrib/notebook/browser/diff/notebookDiff.css +++ b/src/vs/workbench/contrib/notebook/browser/diff/notebookDiff.css @@ -306,3 +306,15 @@ .notebook-text-diff-editor .notebook-overview-ruler-container .diffViewport { z-index: var(--notebook-diff-view-viewport-slider); } + +.notebook-text-diff-editor .diffViewport { + background: var(--vscode-scrollbarSlider-background); +} + +.notebook-text-diff-editor .diffViewport:hover { + background: var(--vscode-scrollbarSlider-hoverBackground); +} + +.notebook-text-diff-editor .diffViewport:active { + background: var(--vscode-scrollbarSlider-activeBackground); +} diff --git a/src/vs/workbench/contrib/notebook/browser/diff/notebookDiffOverviewRuler.ts b/src/vs/workbench/contrib/notebook/browser/diff/notebookDiffOverviewRuler.ts index 7ccc71587d3..e9a9be4f8c7 100644 --- a/src/vs/workbench/contrib/notebook/browser/diff/notebookDiffOverviewRuler.ts +++ b/src/vs/workbench/contrib/notebook/browser/diff/notebookDiffOverviewRuler.ts @@ -8,8 +8,8 @@ import * as DOM from 'vs/base/browser/dom'; import { createFastDomNode, FastDomNode } from 'vs/base/browser/fastDomNode'; import { Color } from 'vs/base/common/color'; import { DisposableStore, IDisposable } from 'vs/base/common/lifecycle'; -import { defaultInsertColor, defaultRemoveColor, diffInserted, diffOverviewRulerInserted, diffOverviewRulerRemoved, diffRemoved, scrollbarSliderActiveBackground, scrollbarSliderBackground, scrollbarSliderHoverBackground } from 'vs/platform/theme/common/colorRegistry'; -import { IColorTheme, IThemeService, registerThemingParticipant, Themable } from 'vs/platform/theme/common/themeService'; +import { defaultInsertColor, defaultRemoveColor, diffInserted, diffOverviewRulerInserted, diffOverviewRulerRemoved, diffRemoved } from 'vs/platform/theme/common/colorRegistry'; +import { IColorTheme, IThemeService, Themable } from 'vs/platform/theme/common/themeService'; import { DiffElementViewModelBase } from 'vs/workbench/contrib/notebook/browser/diff/diffElementViewModel'; import { NotebookDiffEditorEventDispatcher } from 'vs/workbench/contrib/notebook/browser/diff/eventDispatcher'; import { INotebookTextDiffEditor } from 'vs/workbench/contrib/notebook/browser/diff/notebookDiffEditorBrowser'; @@ -214,32 +214,3 @@ export class NotebookDiffOverviewRuler extends Themable { super.dispose(); } } - -registerThemingParticipant((theme, collector) => { - const scrollbarSliderBackgroundColor = theme.getColor(scrollbarSliderBackground); - if (scrollbarSliderBackgroundColor) { - collector.addRule(` - .notebook-text-diff-editor .diffViewport { - background: ${scrollbarSliderBackgroundColor}; - } - `); - } - - const scrollbarSliderHoverBackgroundColor = theme.getColor(scrollbarSliderHoverBackground); - if (scrollbarSliderHoverBackgroundColor) { - collector.addRule(` - .notebook-text-diff-editor .diffViewport:hover { - background: ${scrollbarSliderHoverBackgroundColor}; - } - `); - } - - const scrollbarSliderActiveBackgroundColor = theme.getColor(scrollbarSliderActiveBackground); - if (scrollbarSliderActiveBackgroundColor) { - collector.addRule(` - .notebook-text-diff-editor .diffViewport:active { - background: ${scrollbarSliderActiveBackgroundColor}; - } - `); - } -}); From 55a95c7086307225f7562cbb813383a806b45a9f Mon Sep 17 00:00:00 2001 From: rebornix Date: Tue, 1 Nov 2022 22:36:34 -0700 Subject: [PATCH 042/185] Reduce theme participant for notebook diff editor --- .../notebook/browser/diff/notebookDiff.css | 72 +++++++++++ .../browser/diff/notebookDiffEditor.ts | 122 +----------------- 2 files changed, 74 insertions(+), 120 deletions(-) diff --git a/src/vs/workbench/contrib/notebook/browser/diff/notebookDiff.css b/src/vs/workbench/contrib/notebook/browser/diff/notebookDiff.css index d8bd1615fb1..a0a89a75d84 100644 --- a/src/vs/workbench/contrib/notebook/browser/diff/notebookDiff.css +++ b/src/vs/workbench/contrib/notebook/browser/diff/notebookDiff.css @@ -318,3 +318,75 @@ .notebook-text-diff-editor .diffViewport:active { background: var(--vscode-scrollbarSlider-activeBackground); } + +/** Diff cell borders */ +.notebook-text-diff-editor .cell-body .border-container .top-border, +.notebook-text-diff-editor .cell-body .border-container .bottom-border, +.notebook-text-diff-editor .cell-diff-editor-container .output-header-container, +.notebook-text-diff-editor .cell-diff-editor-container .metadata-header-container { + border-top: 1px solid var(--vscode-notebook-cellBorderColor); +} + +.notebook-text-diff-editor .cell-body .border-container .left-border { + border-left: 1px solid var(--vscode-notebook-cellBorderColor); +} + +.notebook-text-diff-editor .cell-body .border-container .right-border { + border-right: 1px solid var(--vscode-notebook-cellBorderColor); +} + +/** Diff cell active borders */ +.notebook-text-diff-editor .monaco-list-row.focused .cell-body .border-container .top-border, +.notebook-text-diff-editor .monaco-list-row.focused .cell-body .border-container .bottom-border { + border-top: 1px solid var(--vscode-notebook-focusedEditorBorder); +} + +.notebook-text-diff-editor .monaco-list-row.focused .cell-body .border-container .left-border { + border-left: 1px solid var(--vscode-notebook-focusedEditorBorder); +} + +.notebook-text-diff-editor .monaco-list-row.focused .cell-body .border-container .right-border { + border-right: 1px solid var(--vscode-notebook-focusedEditorBorder); +} + +/** Diff cell diff background */ + +.monaco-workbench .notebook-text-diff-editor .cell-body.full .output-info-container.modified .output-view-container .output-view-container-right div.foreground, +.monaco-workbench .notebook-text-diff-editor .cell-body.right .output-info-container .output-view-container div.foreground, +.monaco-workbench .notebook-text-diff-editor .cell-body.right .output-info-container .output-view-container div.output-empty-view, +.notebook-text-diff-editor .cell-body .cell-diff-editor-container.inserted .source-container, +.notebook-text-diff-editor .cell-body .cell-diff-editor-container.inserted .source-container .monaco-editor .margin, +.notebook-text-diff-editor .cell-body .cell-diff-editor-container.inserted .source-container .monaco-editor .monaco-editor-background, +.notebook-text-diff-editor .cell-body .cell-diff-editor-container.inserted .metadata-editor-container, +.notebook-text-diff-editor .cell-body .cell-diff-editor-container.inserted .metadata-editor-container .monaco-editor .margin, +.notebook-text-diff-editor .cell-body .cell-diff-editor-container.inserted .metadata-editor-container .monaco-editor .monaco-editor-background, +.notebook-text-diff-editor .cell-body .cell-diff-editor-container.inserted .output-editor-container, +.notebook-text-diff-editor .cell-body .cell-diff-editor-container.inserted .output-editor-container .monaco-editor .margin, +.notebook-text-diff-editor .cell-body .cell-diff-editor-container.inserted .output-editor-container .monaco-editor .monaco-editor-background, +.notebook-text-diff-editor .cell-body .cell-diff-editor-container.inserted .metadata-header-container, +.notebook-text-diff-editor .cell-body .cell-diff-editor-container.inserted .output-header-container { + background-color: var(--vscode-diffEditor-insertedTextBackground); +} + +.monaco-workbench .notebook-text-diff-editor .cell-body.full .output-info-container.modified .output-view-container .output-view-container-left div.foreground, +.monaco-workbench .notebook-text-diff-editor .cell-body.left .output-info-container .output-view-container div.foreground, +.monaco-workbench .notebook-text-diff-editor .cell-body.left .output-info-container .output-view-container div.output-empty-view, +.notebook-text-diff-editor .cell-body .cell-diff-editor-container.removed .source-container, +.notebook-text-diff-editor .cell-body .cell-diff-editor-container.removed .source-container .monaco-editor .margin, +.notebook-text-diff-editor .cell-body .cell-diff-editor-container.removed .source-container .monaco-editor .monaco-editor-background, +.notebook-text-diff-editor .cell-body .cell-diff-editor-container.removed .metadata-editor-container, +.notebook-text-diff-editor .cell-body .cell-diff-editor-container.removed .metadata-editor-container .monaco-editor .margin, +.notebook-text-diff-editor .cell-body .cell-diff-editor-container.removed .metadata-editor-container .monaco-editor .monaco-editor-background, +.notebook-text-diff-editor .cell-body .cell-diff-editor-container.removed .output-editor-container, +.notebook-text-diff-editor .cell-body .cell-diff-editor-container.removed .output-editor-container .monaco-editor .margin, +.notebook-text-diff-editor .cell-body .cell-diff-editor-container.removed .output-editor-container .monaco-editor .monaco-editor-background, +.notebook-text-diff-editor .cell-body .cell-diff-editor-container.removed .metadata-header-container, +.notebook-text-diff-editor .cell-body .cell-diff-editor-container.removed .output-header-container { + background-color: var(--vscode-diffEditor-removedTextBackground); +} + +/** Diff cell editor background */ +.notebook-text-diff-editor .cell-body .cell-diff-editor-container .source-container .monaco-editor .margin, +.notebook-text-diff-editor .cell-body .cell-diff-editor-container .source-container .monaco-editor .monaco-editor-background { + background: var(--vscode-notebook-cellEditorBackground, var(--vscode-editor-background)); +} diff --git a/src/vs/workbench/contrib/notebook/browser/diff/notebookDiffEditor.ts b/src/vs/workbench/contrib/notebook/browser/diff/notebookDiffEditor.ts index 5b3b671e3a3..a1af89f6e23 100644 --- a/src/vs/workbench/contrib/notebook/browser/diff/notebookDiffEditor.ts +++ b/src/vs/workbench/contrib/notebook/browser/diff/notebookDiffEditor.ts @@ -9,7 +9,7 @@ import { IStorageService } from 'vs/platform/storage/common/storage'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IThemeService, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { EditorPaneSelectionChangeReason, EditorPaneSelectionCompareResult, IEditorOpenContext, IEditorPaneSelection, IEditorPaneSelectionChangeEvent, IEditorPaneWithSelection } from 'vs/workbench/common/editor'; -import { cellEditorBackground, focusedEditorBorderColor, getDefaultNotebookCreationOptions, notebookCellBorder, NotebookEditorWidget } from 'vs/workbench/contrib/notebook/browser/notebookEditorWidget'; +import { getDefaultNotebookCreationOptions, NotebookEditorWidget } from 'vs/workbench/contrib/notebook/browser/notebookEditorWidget'; import { IEditorGroup } from 'vs/workbench/services/editor/common/editorGroupsService'; import { NotebookDiffEditorInput } from '../../common/notebookDiffEditorInput'; import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation'; @@ -17,7 +17,7 @@ import { DiffElementViewModelBase, SideBySideDiffElementViewModel, SingleSideDif import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { CellDiffSideBySideRenderer, CellDiffSingleSideRenderer, NotebookCellTextDiffListDelegate, NotebookTextDiffList } from 'vs/workbench/contrib/notebook/browser/diff/notebookDiffList'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; -import { diffDiagonalFill, diffInserted, diffRemoved, editorBackground, focusBorder, foreground } from 'vs/platform/theme/common/colorRegistry'; +import { diffDiagonalFill, editorBackground, focusBorder, foreground } from 'vs/platform/theme/common/colorRegistry'; import { INotebookEditorWorkerService } from 'vs/workbench/contrib/notebook/common/services/notebookWorkerService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IEditorOptions as ICodeEditorOptions } from 'vs/editor/common/config/editorOptions'; @@ -1023,27 +1023,6 @@ export class NotebookTextDiffEditor extends EditorPane implements INotebookTextD registerZIndex(ZIndex.Base, 10, 'notebook-diff-view-viewport-slider'); registerThemingParticipant((theme, collector) => { - const cellBorderColor = theme.getColor(notebookCellBorder); - if (cellBorderColor) { - collector.addRule(`.notebook-text-diff-editor .cell-body .border-container .top-border { border-top: 1px solid ${cellBorderColor};}`); - collector.addRule(`.notebook-text-diff-editor .cell-body .border-container .bottom-border { border-top: 1px solid ${cellBorderColor};}`); - collector.addRule(`.notebook-text-diff-editor .cell-body .border-container .left-border { border-left: 1px solid ${cellBorderColor};}`); - collector.addRule(`.notebook-text-diff-editor .cell-body .border-container .right-border { border-right: 1px solid ${cellBorderColor};}`); - collector.addRule(`.notebook-text-diff-editor .cell-diff-editor-container .output-header-container, - .notebook-text-diff-editor .cell-diff-editor-container .metadata-header-container { - border-top: 1px solid ${cellBorderColor}; - }`); - } - - const focusCellBackgroundColor = theme.getColor(focusedEditorBorderColor); - - if (focusCellBackgroundColor) { - collector.addRule(`.notebook-text-diff-editor .monaco-list-row.focused .cell-body .border-container .top-border { border-top: 1px solid ${focusCellBackgroundColor};}`); - collector.addRule(`.notebook-text-diff-editor .monaco-list-row.focused .cell-body .border-container .bottom-border { border-top: 1px solid ${focusCellBackgroundColor};}`); - collector.addRule(`.notebook-text-diff-editor .monaco-list-row.focused .cell-body .border-container .left-border { border-left: 1px solid ${focusCellBackgroundColor};}`); - collector.addRule(`.notebook-text-diff-editor .monaco-list-row.focused .cell-body .border-container .right-border { border-right: 1px solid ${focusCellBackgroundColor};}`); - } - const diffDiagonalFillColor = theme.getColor(diffDiagonalFill); collector.addRule(` .notebook-text-diff-editor .diagonal-fill { @@ -1058,102 +1037,5 @@ registerThemingParticipant((theme, collector) => { } `); - const editorBackgroundColor = theme.getColor(cellEditorBackground) ?? theme.getColor(editorBackground); - if (editorBackgroundColor) { - collector.addRule(`.notebook-text-diff-editor .cell-body .cell-diff-editor-container .source-container .monaco-editor .margin, - .notebook-text-diff-editor .cell-body .cell-diff-editor-container .source-container .monaco-editor .monaco-editor-background { background: ${editorBackgroundColor}; }` - ); - } - - const added = theme.getColor(diffInserted); - if (added) { - collector.addRule( - ` - .monaco-workbench .notebook-text-diff-editor .cell-body.full .output-info-container.modified .output-view-container .output-view-container-right div.foreground { background-color: ${added}; } - .monaco-workbench .notebook-text-diff-editor .cell-body.right .output-info-container .output-view-container div.foreground { background-color: ${added}; } - .monaco-workbench .notebook-text-diff-editor .cell-body.right .output-info-container .output-view-container div.output-empty-view { background-color: ${added}; } - ` - ); - collector.addRule(` - .notebook-text-diff-editor .cell-body .cell-diff-editor-container.inserted .source-container { background-color: ${added}; } - .notebook-text-diff-editor .cell-body .cell-diff-editor-container.inserted .source-container .monaco-editor .margin, - .notebook-text-diff-editor .cell-body .cell-diff-editor-container.inserted .source-container .monaco-editor .monaco-editor-background { - background-color: ${added}; - } - ` - ); - collector.addRule(` - .notebook-text-diff-editor .cell-body .cell-diff-editor-container.inserted .metadata-editor-container { background-color: ${added}; } - .notebook-text-diff-editor .cell-body .cell-diff-editor-container.inserted .metadata-editor-container .monaco-editor .margin, - .notebook-text-diff-editor .cell-body .cell-diff-editor-container.inserted .metadata-editor-container .monaco-editor .monaco-editor-background { - background-color: ${added}; - } - ` - ); - collector.addRule(` - .notebook-text-diff-editor .cell-body .cell-diff-editor-container.inserted .output-editor-container { background-color: ${added}; } - .notebook-text-diff-editor .cell-body .cell-diff-editor-container.inserted .output-editor-container .monaco-editor .margin, - .notebook-text-diff-editor .cell-body .cell-diff-editor-container.inserted .output-editor-container .monaco-editor .monaco-editor-background { - background-color: ${added}; - } - ` - ); - collector.addRule(` - .notebook-text-diff-editor .cell-body .cell-diff-editor-container.inserted .metadata-header-container { background-color: ${added}; } - .notebook-text-diff-editor .cell-body .cell-diff-editor-container.inserted .output-header-container { background-color: ${added}; } - ` - ); - } - const removed = theme.getColor(diffRemoved); - if (removed) { - collector.addRule( - ` - .monaco-workbench .notebook-text-diff-editor .cell-body.full .output-info-container.modified .output-view-container .output-view-container-left div.foreground { background-color: ${removed}; } - .monaco-workbench .notebook-text-diff-editor .cell-body.left .output-info-container .output-view-container div.foreground { background-color: ${removed}; } - .monaco-workbench .notebook-text-diff-editor .cell-body.left .output-info-container .output-view-container div.output-empty-view { background-color: ${removed}; } - - ` - ); - collector.addRule(` - .notebook-text-diff-editor .cell-body .cell-diff-editor-container.removed .source-container { background-color: ${removed}; } - .notebook-text-diff-editor .cell-body .cell-diff-editor-container.removed .source-container .monaco-editor .margin, - .notebook-text-diff-editor .cell-body .cell-diff-editor-container.removed .source-container .monaco-editor .monaco-editor-background { - background-color: ${removed}; - } - ` - ); - collector.addRule(` - .notebook-text-diff-editor .cell-body .cell-diff-editor-container.removed .metadata-editor-container { background-color: ${removed}; } - .notebook-text-diff-editor .cell-body .cell-diff-editor-container.removed .metadata-editor-container .monaco-editor .margin, - .notebook-text-diff-editor .cell-body .cell-diff-editor-container.removed .metadata-editor-container .monaco-editor .monaco-editor-background { - background-color: ${removed}; - } - ` - ); - collector.addRule(` - .notebook-text-diff-editor .cell-body .cell-diff-editor-container.removed .output-editor-container { background-color: ${removed}; } - .notebook-text-diff-editor .cell-body .cell-diff-editor-container.removed .output-editor-container .monaco-editor .margin, - .notebook-text-diff-editor .cell-body .cell-diff-editor-container.removed .output-editor-container .monaco-editor .monaco-editor-background { - background-color: ${removed}; - } - ` - ); - collector.addRule(` - .notebook-text-diff-editor .cell-body .cell-diff-editor-container.removed .metadata-header-container { background-color: ${removed}; } - .notebook-text-diff-editor .cell-body .cell-diff-editor-container.removed .output-header-container { background-color: ${removed}; } - ` - ); - } - - // const changed = theme.getColor(editorGutterModifiedBackground); - - // if (changed) { - // collector.addRule(` - // .notebook-text-diff-editor .cell-diff-editor-container .metadata-header-container.modified { - // background-color: ${changed}; - // } - // `); - // } - collector.addRule(`.notebook-text-diff-editor .cell-body { margin: ${DIFF_CELL_MARGIN}px; }`); }); From ad94ce6435507ec66847d6a7c45f355bec2a97f8 Mon Sep 17 00:00:00 2001 From: Megan Rogge Date: Wed, 2 Nov 2022 03:11:14 -0400 Subject: [PATCH 043/185] use ID for quick fix telemetry (#165197) --- .../tasks/browser/terminalTaskSystem.ts | 2 +- .../contrib/terminal/browser/terminal.ts | 2 ++ .../browser/terminalQuickFixBuiltinActions.ts | 2 ++ .../terminal/browser/xterm/quickFixAddon.ts | 21 ++++++++++++------- .../test/browser/quickFixAddon.test.ts | 14 ++++++------- 5 files changed, 25 insertions(+), 16 deletions(-) diff --git a/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts b/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts index 494325996a3..dc338208813 100644 --- a/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts +++ b/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts @@ -120,7 +120,7 @@ class VariableResolver { } } -export class VerifiedTask { +class VerifiedTask { readonly task: Task; readonly resolver: ITaskResolver; readonly trigger: string; diff --git a/src/vs/workbench/contrib/terminal/browser/terminal.ts b/src/vs/workbench/contrib/terminal/browser/terminal.ts index f78fa85e684..6e9c38c9421 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminal.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminal.ts @@ -966,12 +966,14 @@ export type TerminalQuickFixCallback = (matchResult: TerminalQuickFixMatchResult export interface ITerminalQuickFixCommandAction { type: 'command'; + id: string; command: string; // TODO: Should this depend on whether alt is held? addNewLine: boolean; } export interface ITerminalQuickFixOpenerAction { type: 'opener'; + id: string; uri: URI; } diff --git a/src/vs/workbench/contrib/terminal/browser/terminalQuickFixBuiltinActions.ts b/src/vs/workbench/contrib/terminal/browser/terminalQuickFixBuiltinActions.ts index 45e9d5cf747..672cc8ec763 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalQuickFixBuiltinActions.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalQuickFixBuiltinActions.ts @@ -40,6 +40,7 @@ export function gitSimilar(): ITerminalQuickFixOptions { const fixedCommand = results[i]; if (fixedCommand) { actions.push({ + id: 'Git Similar', type: 'command', command: command.command.replace(/git\s+[^\s]+/, `git ${fixedCommand}`), addNewLine: true @@ -70,6 +71,7 @@ export function gitTwoDashes(): ITerminalQuickFixOptions { } return { type: 'command', + id: 'Git Two Dashes', command: command.command.replace(` -${problemArg}`, ` --${problemArg}`), addNewLine: true }; diff --git a/src/vs/workbench/contrib/terminal/browser/xterm/quickFixAddon.ts b/src/vs/workbench/contrib/terminal/browser/xterm/quickFixAddon.ts index fbff7ba0560..9f056ddd982 100644 --- a/src/vs/workbench/contrib/terminal/browser/xterm/quickFixAddon.ts +++ b/src/vs/workbench/contrib/terminal/browser/xterm/quickFixAddon.ts @@ -34,13 +34,13 @@ import { URI } from 'vs/base/common/uri'; import { gitCreatePr, gitPushSetUpstream, gitSimilar } from 'vs/workbench/contrib/terminal/browser/terminalQuickFixBuiltinActions'; const quickFixTelemetryTitle = 'terminal/quick-fix'; type QuickFixResultTelemetryEvent = { - id: string; + quickFixId: string; fixesShown: boolean; ranQuickFixCommand?: boolean; }; type QuickFixClassification = { owner: 'meganrogge'; - id: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'The quick fix ID' }; + quickFixId: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'The quick fix ID' }; fixesShown: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'Whether the fixes were shown by the user' }; ranQuickFixCommand?: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'If the command that was executed matched a quick fix suggested one. Undefined if no command is expected.' }; comment: 'Terminal quick fixes'; @@ -75,6 +75,7 @@ export class TerminalQuickFixAddon extends Disposable implements ITerminalAddon, private _fixesShown: boolean = false; private _expectedCommands: string[] | undefined; + private _fixId: string | undefined; constructor(private readonly _capabilities: ITerminalCapabilityStore, @IContextMenuService private readonly _contextMenuService: IContextMenuService, @@ -131,18 +132,20 @@ export class TerminalQuickFixAddon extends Disposable implements ITerminalAddon, } this._register(commandDetection.onCommandFinished(command => { if (this._expectedCommands) { + const quickFixId = this._fixId || ''; const ranQuickFixCommand = this._expectedCommands.includes(command.command); this._logService.debug(quickFixTelemetryTitle, { - id: this._expectedCommands.join(' '), + quickFixId, fixesShown: this._fixesShown, ranQuickFixCommand }); this._telemetryService?.publicLog2(quickFixTelemetryTitle, { - id: this._expectedCommands.join(' '), + quickFixId, fixesShown: this._fixesShown, ranQuickFixCommand }); this._expectedCommands = undefined; + this._fixId = undefined; } this._resolveQuickFixes(command); this._fixesShown = false; @@ -170,16 +173,17 @@ export class TerminalQuickFixAddon extends Disposable implements ITerminalAddon, } const { fixes, onDidRunQuickFix, expectedCommands } = result; this._expectedCommands = expectedCommands; + this._fixId = fixes.map(f => f.id).join(''); this._quickFixes = fixes; - this._register(onDidRunQuickFix((id) => { + this._register(onDidRunQuickFix((quickFixId) => { const ranQuickFixCommand = (this._expectedCommands?.includes(command.command) || false); this._logService.debug(quickFixTelemetryTitle, { - id, + quickFixId, fixesShown: this._fixesShown, ranQuickFixCommand }); this._telemetryService?.publicLog2(quickFixTelemetryTitle, { - id, + quickFixId, fixesShown: this._fixesShown, ranQuickFixCommand }); @@ -270,7 +274,7 @@ export function getQuickFixesForCommand( case 'command': { const label = localize('quickFix.command', 'Run: {0}', quickFix.command); action = { - id: `quickFix.command`, + id: quickFix.id, label, class: undefined, enabled: true, @@ -372,6 +376,7 @@ export function convertToQuickFixOptions(quickFix: IExtensionTerminalQuickFix): if (fixedCommand) { actions.push({ type: 'command', + id: quickFix.id, command: fixedCommand, addNewLine: true }); diff --git a/src/vs/workbench/contrib/terminal/test/browser/quickFixAddon.test.ts b/src/vs/workbench/contrib/terminal/test/browser/quickFixAddon.test.ts index 2e3a8063fb2..e49d75f87da 100644 --- a/src/vs/workbench/contrib/terminal/test/browser/quickFixAddon.test.ts +++ b/src/vs/workbench/contrib/terminal/test/browser/quickFixAddon.test.ts @@ -61,7 +61,7 @@ suite('QuickFixAddon', () => { status`; const exitCode = 1; const actions = [{ - id: `quickFix.command`, + id: 'Git Similar', enabled: true, label: 'Run: git status', tooltip: 'Run: git status', @@ -100,13 +100,13 @@ suite('QuickFixAddon', () => { pull push`; const actions = [{ - id: `quickFix.command`, + id: 'Git Similar', enabled: true, label: 'Run: git pull', tooltip: 'Run: git pull', command: 'git pull' }, { - id: `quickFix.command`, + id: 'Git Similar', enabled: true, label: 'Run: git push', tooltip: 'Run: git push', @@ -120,7 +120,7 @@ suite('QuickFixAddon', () => { The most similar commands are checkout`; assertMatchOptions(getQuickFixesForCommand(createCommand('git checkoutt .', output, GitSimilarOutputRegex), expectedMap, openerService)?.fixes, [{ - id: `quickFix.command`, + id: 'Git Similar', enabled: true, label: 'Run: git checkout .', tooltip: 'Run: git checkout .', @@ -135,7 +135,7 @@ suite('QuickFixAddon', () => { const output = 'error: did you mean `--all` (with two dashes)?'; const exitCode = 1; const actions = [{ - id: `quickFix.command`, + id: 'Git Two Dashes', enabled: true, label: 'Run: git add . --all', tooltip: 'Run: git add . --all', @@ -213,7 +213,7 @@ suite('QuickFixAddon', () => { git push --set-upstream origin test22`; const exitCode = 128; const actions = [{ - id: `quickFix.command`, + id: 'Git Push Set Upstream', enabled: true, label: 'Run: git push --set-upstream origin test22', tooltip: 'Run: git push --set-upstream origin test22', @@ -292,7 +292,7 @@ suite('QuickFixAddon', () => { git push --set-upstream origin test22`; const exitCode = 128; const actions = [{ - id: `quickFix.command`, + id: 'Git Push Set Upstream', enabled: true, label: 'Run: git push --set-upstream origin test22', tooltip: 'Run: git push --set-upstream origin test22', From 7fbec6dcc9262947012eb4dcbe763e6ec7b62ef0 Mon Sep 17 00:00:00 2001 From: Ping <5123601+pingren@users.noreply.github.com> Date: Wed, 2 Nov 2022 16:09:32 +0800 Subject: [PATCH 044/185] Fix KaTeX equation numbering in notebook preview (#156276) Fixes https://github.com/microsoft/vscode/issues/155888 --- extensions/markdown-math/notebook/katex.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/extensions/markdown-math/notebook/katex.ts b/extensions/markdown-math/notebook/katex.ts index 299ab9373de..631b3ac51c5 100644 --- a/extensions/markdown-math/notebook/katex.ts +++ b/extensions/markdown-math/notebook/katex.ts @@ -33,6 +33,9 @@ export async function activate(ctx: RendererContext) { .katex-error { color: var(--vscode-editorError-foreground); } + .katex-block { + counter-reset: katexEqnNo mmlEqnNo; + } `; // Put Everything into a template From ff51b872dfed02026e4178ca34ef1b82835b7a31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Wed, 2 Nov 2022 01:17:43 -0700 Subject: [PATCH 045/185] cleanup ipc integration tests (#165221) --- src/vs/base/parts/ipc/node/ipc.cp.ts | 6 +- .../ipc/test/node/ipc.cp.integrationTest.ts | 63 ++++++++----------- 2 files changed, 29 insertions(+), 40 deletions(-) diff --git a/src/vs/base/parts/ipc/node/ipc.cp.ts b/src/vs/base/parts/ipc/node/ipc.cp.ts index 810c95bdadb..a6dd5527c1f 100644 --- a/src/vs/base/parts/ipc/node/ipc.cp.ts +++ b/src/vs/base/parts/ipc/node/ipc.cp.ts @@ -274,10 +274,8 @@ export class Client implements IChannelClient, IDisposable { dispose() { this._onDidProcessExit.dispose(); - if (this.disposeDelayer) { - this.disposeDelayer.cancel(); - this.disposeDelayer = undefined; - } + this.disposeDelayer?.cancel(); + this.disposeDelayer = undefined; this.disposeClient(); this.activeRequests.clear(); } diff --git a/src/vs/base/parts/ipc/test/node/ipc.cp.integrationTest.ts b/src/vs/base/parts/ipc/test/node/ipc.cp.integrationTest.ts index 386580ae5a6..09d94dd85c2 100644 --- a/src/vs/base/parts/ipc/test/node/ipc.cp.integrationTest.ts +++ b/src/vs/base/parts/ipc/test/node/ipc.cp.integrationTest.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { timeout } from 'vs/base/common/async'; +import { Event } from 'vs/base/common/event'; import { Client } from 'vs/base/parts/ipc/node/ipc.cp'; import { getPathFromAmdModule } from 'vs/base/test/node/testUtils'; import { TestServiceClient } from './testService'; @@ -17,46 +17,38 @@ function createClient(): Client { } suite('IPC, Child Process', function () { + this.slow(2000); this.timeout(10000); - test('createChannel', () => { + test('createChannel', async () => { const client = createClient(); const channel = client.getChannel('test'); const service = new TestServiceClient(channel); - const result = service.pong('ping').then(r => { - assert.strictEqual(r.incoming, 'ping'); - assert.strictEqual(r.outgoing, 'pong'); - }); + const result = await service.pong('ping'); + assert.strictEqual(result.incoming, 'ping'); + assert.strictEqual(result.outgoing, 'pong'); - return result.finally(() => client.dispose()); + client.dispose(); }); - test('events', () => { + test('events', async () => { const client = createClient(); const channel = client.getChannel('test'); const service = new TestServiceClient(channel); - const event = new Promise((c, e) => { - service.onMarco(({ answer }) => { - try { - assert.strictEqual(answer, 'polo'); - c(undefined); - } catch (err) { - e(err); - } - }); - }); + const event = Event.toPromise(Event.once(service.onMarco)); + const promise = service.marco(); - return timeout(100).then(() => { - const request = service.marco(); - const result = Promise.all([request, event]); + const [promiseResult, eventResult] = await Promise.all([promise, event]); - return result.finally(() => client.dispose()); - }); + assert.strictEqual(promiseResult, 'polo'); + assert.strictEqual(eventResult.answer, 'polo'); + + client.dispose(); }); - test('event dispose', () => { + test('event dispose', async () => { const client = createClient(); const channel = client.getChannel('test'); const service = new TestServiceClient(channel); @@ -64,20 +56,19 @@ suite('IPC, Child Process', function () { let count = 0; const disposable = service.onMarco(() => count++); - const result = service.marco().then(async answer => { - assert.strictEqual(answer, 'polo'); - assert.strictEqual(count, 1); + const answer = await service.marco(); + assert.strictEqual(answer, 'polo'); + assert.strictEqual(count, 1); - const answer_1 = await service.marco(); - assert.strictEqual(answer_1, 'polo'); - assert.strictEqual(count, 2); - disposable.dispose(); + const answer_1 = await service.marco(); + assert.strictEqual(answer_1, 'polo'); + assert.strictEqual(count, 2); + disposable.dispose(); - const answer_2 = await service.marco(); - assert.strictEqual(answer_2, 'polo'); - assert.strictEqual(count, 2); - }); + const answer_2 = await service.marco(); + assert.strictEqual(answer_2, 'polo'); + assert.strictEqual(count, 2); - return result.finally(() => client.dispose()); + client.dispose(); }); }); From cbf6c41591a287d2c645e7b6e8f48533a7ad9b30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Wed, 2 Nov 2022 03:52:32 -0700 Subject: [PATCH 046/185] more test cleanup (#165233) --- .../ipc/test/node/ipc.cp.integrationTest.ts | 37 +++++++++---------- 1 file changed, 17 insertions(+), 20 deletions(-) diff --git a/src/vs/base/parts/ipc/test/node/ipc.cp.integrationTest.ts b/src/vs/base/parts/ipc/test/node/ipc.cp.integrationTest.ts index 09d94dd85c2..4b7942024f0 100644 --- a/src/vs/base/parts/ipc/test/node/ipc.cp.integrationTest.ts +++ b/src/vs/base/parts/ipc/test/node/ipc.cp.integrationTest.ts @@ -5,9 +5,10 @@ import * as assert from 'assert'; import { Event } from 'vs/base/common/event'; +import { IChannel } from 'vs/base/parts/ipc/common/ipc'; import { Client } from 'vs/base/parts/ipc/node/ipc.cp'; import { getPathFromAmdModule } from 'vs/base/test/node/testUtils'; -import { TestServiceClient } from './testService'; +import { ITestService, TestServiceClient } from './testService'; function createClient(): Client { return new Client(getPathFromAmdModule(require, 'bootstrap-fork'), { @@ -20,23 +21,27 @@ suite('IPC, Child Process', function () { this.slow(2000); this.timeout(10000); - test('createChannel', async () => { - const client = createClient(); - const channel = client.getChannel('test'); - const service = new TestServiceClient(channel); + let client: Client; + let channel: IChannel; + let service: ITestService; - const result = await service.pong('ping'); - assert.strictEqual(result.incoming, 'ping'); - assert.strictEqual(result.outgoing, 'pong'); + setup(() => { + client = createClient(); + channel = client.getChannel('test'); + service = new TestServiceClient(channel); + }); + teardown(() => { client.dispose(); }); - test('events', async () => { - const client = createClient(); - const channel = client.getChannel('test'); - const service = new TestServiceClient(channel); + test('createChannel', async () => { + const result = await service.pong('ping'); + assert.strictEqual(result.incoming, 'ping'); + assert.strictEqual(result.outgoing, 'pong'); + }); + test('events', async () => { const event = Event.toPromise(Event.once(service.onMarco)); const promise = service.marco(); @@ -44,15 +49,9 @@ suite('IPC, Child Process', function () { assert.strictEqual(promiseResult, 'polo'); assert.strictEqual(eventResult.answer, 'polo'); - - client.dispose(); }); test('event dispose', async () => { - const client = createClient(); - const channel = client.getChannel('test'); - const service = new TestServiceClient(channel); - let count = 0; const disposable = service.onMarco(() => count++); @@ -68,7 +67,5 @@ suite('IPC, Child Process', function () { const answer_2 = await service.marco(); assert.strictEqual(answer_2, 'polo'); assert.strictEqual(count, 2); - - client.dispose(); }); }); From cc7114b3bafebfdd1552bb2dd96812facc56d6c8 Mon Sep 17 00:00:00 2001 From: Logan Ramos Date: Wed, 2 Nov 2022 09:10:49 -0400 Subject: [PATCH 047/185] Switch to using CSS (#165185) * Switch to using CSS * Better fallback value --- .../browser/gettingStarted.ts | 133 +---------------- .../browser/media/gettingStarted.css | 138 ++++++++++++++++++ 2 files changed, 139 insertions(+), 132 deletions(-) diff --git a/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.ts b/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.ts index 37fce5dcf39..b35a466ad0b 100644 --- a/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.ts +++ b/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.ts @@ -13,9 +13,7 @@ import { $, addDisposableListener, append, clearNode, Dimension, reset } from 'v import { ICommandService } from 'vs/platform/commands/common/commands'; import { IProductService } from 'vs/platform/product/common/productService'; import { hiddenEntriesConfigurationKey, IResolvedWalkthrough, IResolvedWalkthroughStep, IWalkthroughsService } from 'vs/workbench/contrib/welcomeGettingStarted/browser/gettingStartedService'; -import { IThemeService, registerThemingParticipant, ThemeIcon } from 'vs/platform/theme/common/themeService'; -import { welcomePageBackground, welcomePageProgressBackground, welcomePageProgressForeground, welcomePageTileBackground, welcomePageTileHoverBackground, welcomePageTileShadow } from 'vs/workbench/contrib/welcomeGettingStarted/browser/gettingStartedColors'; -import { activeContrastBorder, buttonBackground, buttonForeground, buttonHoverBackground, contrastBorder, descriptionForeground, focusBorder, foreground, checkboxBackground, checkboxBorder, checkboxForeground, textLinkActiveForeground, textLinkForeground } from 'vs/platform/theme/common/colorRegistry'; +import { IThemeService, ThemeIcon } from 'vs/platform/theme/common/themeService'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { firstSessionDateStorageKey, ITelemetryService, TelemetryLevel } from 'vs/platform/telemetry/common/telemetry'; import { DomScrollableElement } from 'vs/base/browser/ui/scrollbar/scrollableElement'; @@ -55,7 +53,6 @@ import { Schemas } from 'vs/base/common/network'; import { IEditorOptions } from 'vs/platform/editor/common/editor'; import { coalesce, equals, flatten } from 'vs/base/common/arrays'; import { ThemeSettings } from 'vs/workbench/services/themes/common/workbenchThemeService'; -import { ACTIVITY_BAR_BADGE_BACKGROUND, ACTIVITY_BAR_BADGE_FOREGROUND } from 'vs/workbench/common/theme'; import { startEntries } from 'vs/workbench/contrib/welcomeGettingStarted/common/gettingStartedContent'; import { MarkdownRenderer } from 'vs/editor/contrib/markdownRenderer/browser/markdownRenderer'; import { GettingStartedIndexList } from './gettingStartedList'; @@ -1457,131 +1454,3 @@ export class GettingStartedInputSerializer implements IEditorSerializer { return new GettingStartedInput({}); } } - -registerThemingParticipant((theme, collector) => { - - const backgroundColor = theme.getColor(welcomePageBackground); - if (backgroundColor) { - collector.addRule(`.monaco-workbench .part.editor > .content .gettingStartedContainer { background-color: ${backgroundColor}; }`); - } - - const foregroundColor = theme.getColor(foreground); - if (foregroundColor) { - collector.addRule(`.monaco-workbench .part.editor > .content .gettingStartedContainer { color: ${foregroundColor}; }`); - } - - const descriptionColor = theme.getColor(descriptionForeground); - if (descriptionColor) { - collector.addRule(`.monaco-workbench .part.editor > .content .gettingStartedContainer .description { color: ${descriptionColor}; }`); - collector.addRule(`.monaco-workbench .part.editor > .content .gettingStartedContainer .category-progress .message { color: ${descriptionColor}; }`); - collector.addRule(`.monaco-workbench .part.editor > .content .gettingStartedContainer .gettingStartedSlideDetails .gettingStartedDetailsContent > .getting-started-footer { color: ${descriptionColor}; }`); - } - - const iconColor = theme.getColor(textLinkForeground); - if (iconColor) { - collector.addRule(`.monaco-workbench .part.editor > .content .gettingStartedContainer .icon-widget { color: ${iconColor} }`); - collector.addRule(`.monaco-workbench .part.editor > .content .gettingStartedContainer .gettingStartedSlideDetails .getting-started-step .codicon-getting-started-step-checked { color: ${iconColor} } `); - collector.addRule(`.monaco-workbench .part.editor > .content .gettingStartedContainer .gettingStartedSlideDetails .getting-started-step.expanded .codicon-getting-started-step-unchecked { color: ${iconColor} } `); - } - - const buttonColor = theme.getColor(welcomePageTileBackground); - if (buttonColor) { - collector.addRule(`.monaco-workbench .part.editor > .content .gettingStartedContainer button { background: ${buttonColor}; }`); - } - - const shadowColor = theme.getColor(welcomePageTileShadow); - if (shadowColor) { - collector.addRule(`.monaco-workbench .part.editor > .content .gettingStartedContainer .gettingStartedSlideCategories .getting-started-category { filter: drop-shadow(2px 2px 2px ${buttonColor}); }`); - } - - const buttonHoverColor = theme.getColor(welcomePageTileHoverBackground); - if (buttonHoverColor) { - collector.addRule(`.monaco-workbench .part.editor > .content .gettingStartedContainer button:hover { background: ${buttonHoverColor}; }`); - } - if (buttonColor && buttonHoverColor) { - collector.addRule(`.monaco-workbench .part.editor > .content .gettingStartedContainer button.expanded:hover { background: ${buttonColor}; }`); - } - - const emphasisButtonForeground = theme.getColor(buttonForeground); - if (emphasisButtonForeground) { - collector.addRule(`.monaco-workbench .part.editor > .content .gettingStartedContainer button.emphasis { color: ${emphasisButtonForeground}; }`); - } - - const emphasisButtonBackground = theme.getColor(buttonBackground); - if (emphasisButtonBackground) { - collector.addRule(`.monaco-workbench .part.editor > .content .gettingStartedContainer button.emphasis { background: ${emphasisButtonBackground}; }`); - } - - const pendingStepColor = theme.getColor(descriptionForeground); - if (pendingStepColor) { - collector.addRule(`.monaco-workbench .part.editor > .content .gettingStartedContainer .gettingStartedSlideDetails .getting-started-step .codicon-getting-started-step-unchecked { color: ${pendingStepColor} } `); - } - - const emphasisButtonHoverBackground = theme.getColor(buttonHoverBackground); - if (emphasisButtonHoverBackground) { - collector.addRule(`.monaco-workbench .part.editor > .content .gettingStartedContainer button.emphasis:hover { background: ${emphasisButtonHoverBackground}; }`); - } - - const link = theme.getColor(textLinkForeground); - if (link) { - collector.addRule(`.monaco-workbench .part.editor > .content .gettingStartedContainer a:not(.hide-category-button) { color: ${link}; }`); - collector.addRule(`.monaco-workbench .part.editor > .content .gettingStartedContainer .button-link { color: ${link}; }`); - collector.addRule(`.monaco-workbench .part.editor > .content .gettingStartedContainer .button-link .codicon { color: ${link}; }`); - } - const activeLink = theme.getColor(textLinkActiveForeground); - if (activeLink) { - collector.addRule(`.monaco-workbench .part.editor > .content .gettingStartedContainer a:not(.hide-category-button):hover { color: ${activeLink}; }`); - collector.addRule(`.monaco-workbench .part.editor > .content .gettingStartedContainer a:not(.hide-category-button):active { color: ${activeLink}; }`); - collector.addRule(`.monaco-workbench .part.editor > .content .gettingStartedContainer button.button-link:hover { color: ${activeLink}; }`); - collector.addRule(`.monaco-workbench .part.editor > .content .gettingStartedContainer button.button-link:hover .codicon { color: ${activeLink}; }`); - } - const focusColor = theme.getColor(focusBorder); - if (focusColor) { - collector.addRule(`.monaco-workbench .part.editor > .content .gettingStartedContainer a:not(.codicon-close):focus { outline-color: ${focusColor}; }`); - } - const border = theme.getColor(contrastBorder); - if (border) { - collector.addRule(`.monaco-workbench .part.editor > .content .gettingStartedContainer button { border: 1px solid ${border}; }`); - collector.addRule(`.monaco-workbench .part.editor > .content .gettingStartedContainer button.button-link { border: inherit; }`); - } - const activeBorder = theme.getColor(activeContrastBorder); - if (activeBorder) { - collector.addRule(`.monaco-workbench .part.editor > .content .gettingStartedContainer button:hover { outline-color: ${activeBorder}; }`); - } - - const progressBackground = theme.getColor(welcomePageProgressBackground); - if (progressBackground) { - collector.addRule(`.monaco-workbench .part.editor > .content .gettingStartedContainer .gettingStartedSlideCategories .progress-bar-outer { background-color: ${progressBackground}; }`); - } - const progressForeground = theme.getColor(welcomePageProgressForeground); - if (progressForeground) { - collector.addRule(`.monaco-workbench .part.editor > .content .gettingStartedContainer .gettingStartedSlideCategories .progress-bar-inner { background-color: ${progressForeground}; }`); - } - - const newBadgeForeground = theme.getColor(ACTIVITY_BAR_BADGE_FOREGROUND); - if (newBadgeForeground) { - collector.addRule(`.monaco-workbench .part.editor>.content .gettingStartedContainer .gettingStartedSlide .getting-started-category .new-badge { color: ${newBadgeForeground}; }`); - collector.addRule(`.monaco-workbench .part.editor>.content .gettingStartedContainer .gettingStartedSlide .getting-started-category .featured .featured-icon { color: ${newBadgeForeground}; }`); - } - - const newBadgeBackground = theme.getColor(ACTIVITY_BAR_BADGE_BACKGROUND); - if (newBadgeBackground) { - collector.addRule(`.monaco-workbench .part.editor>.content .gettingStartedContainer .gettingStartedSlide .getting-started-category .new-badge { background-color: ${newBadgeBackground}; }`); - collector.addRule(`.monaco-workbench .part.editor>.content .gettingStartedContainer .gettingStartedSlide .getting-started-category .featured { border-top-color: ${newBadgeBackground}; }`); - } - - const checkboxBackgroundColor = theme.getColor(checkboxBackground); - if (checkboxBackgroundColor) { - collector.addRule(`.monaco-workbench .part.editor>.content .gettingStartedContainer .gettingStartedSlide .getting-started-checkbox { background-color: ${checkboxBackgroundColor} !important; }`); - } - - const checkboxForegroundColor = theme.getColor(checkboxForeground); - if (checkboxForegroundColor) { - collector.addRule(`.monaco-workbench .part.editor>.content .gettingStartedContainer .gettingStartedSlide .getting-started-checkbox { color: ${checkboxForegroundColor} !important; }`); - } - - const checkboxBorderColor = theme.getColor(checkboxBorder); - if (checkboxBorderColor) { - collector.addRule(`.monaco-workbench .part.editor>.content .gettingStartedContainer .gettingStartedSlide .getting-started-checkbox { border-color: ${checkboxBorderColor} !important; }`); - } -}); diff --git a/src/vs/workbench/contrib/welcomeGettingStarted/browser/media/gettingStarted.css b/src/vs/workbench/contrib/welcomeGettingStarted/browser/media/gettingStarted.css index d9136fe108a..23cb924678c 100644 --- a/src/vs/workbench/contrib/welcomeGettingStarted/browser/media/gettingStarted.css +++ b/src/vs/workbench/contrib/welcomeGettingStarted/browser/media/gettingStarted.css @@ -820,3 +820,141 @@ .monaco-workbench .part.editor>.content .gettingStartedContainer .hide-category-button:hover { background-color: var(--vscode-toolbar-hoverBackground); } + +.monaco-workbench .part.editor > .content .gettingStartedContainer { + background: var(--vscode-welcomePage-background); + color: var(--vscode-foreground); +} + +.monaco-workbench .part.editor > .content .gettingStartedContainer .description { + color: var(--vscode-descriptionForeground); +} + +.monaco-workbench .part.editor > .content .gettingStartedContainer .category-progress .message { + color: var(--vscode-descriptionForeground); +} + +.monaco-workbench .part.editor > .content .gettingStartedContainer .gettingStartedSlideDetails .gettingStartedDetailsContent > .getting-started-footer { + color: var(--vscode-descriptionForeground); +} + +.monaco-workbench .part.editor > .content .gettingStartedContainer .icon-widget { + color: var(--vscode-textLink-foreground); +} + +.monaco-workbench .part.editor > .content .gettingStartedContainer .gettingStartedSlideDetails .getting-started-step .codicon-getting-started-step-checked { + color: var(--vscode-textLink-foreground); +} + +.monaco-workbench .part.editor > .content .gettingStartedContainer .gettingStartedSlideDetails .getting-started-step.expanded .codicon-getting-started-step-unchecked { + color: var(--vscode-textLink-foreground); +} + +.monaco-workbench .part.editor > .content .gettingStartedContainer button { + background: var(--vscode-welcomePage-tileBackground); +} + +.monaco-workbench .part.editor > .content .gettingStartedContainer .gettingStartedSlideCategories .getting-started-category { + filter: drop-shadow(2px 2px 2px var(--vscode-welcomePage-tileShadow)); +} + +.monaco-workbench .part.editor > .content .gettingStartedContainer button:hover { + background: var(--vscode-welcomePage-tileHoverBackground); + outline-color: var(--vscode-contrastActiveBorder, var(--vscode-focusBorder)); +} + +.monaco-workbench .part.editor > .content .gettingStartedContainer button.expanded:hover { + background: var(--vscode-welcomePage-tileBackground); +} + +.monaco-workbench .part.editor > .content .gettingStartedContainer button.emphasis { + color: var(--vscode-button-foreground); +} + +.monaco-workbench .part.editor > .content .gettingStartedContainer button.emphasis { + background: var(--vscode-button-background); +} + +.monaco-workbench .part.editor > .content .gettingStartedContainer .gettingStartedSlideDetails .getting-started-step .codicon-getting-started-step-unchecked { + color: var(--vscode-descriptionForeground); +} + +.monaco-workbench .part.editor > .content .gettingStartedContainer button.emphasis:hover { + background: var(--vscode-button-hoverBackground); +} + +.monaco-workbench .part.editor > .content .gettingStartedContainer a:not(.hide-category-button) { + color: var(--vscode-textLink-foreground); +} + +.monaco-workbench .part.editor > .content .gettingStartedContainer .button-link { + color: var(--vscode-textLink-foreground); +} + +.monaco-workbench .part.editor > .content .gettingStartedContainer .button-link .codicon { + color: var(--vscode-textLink-foreground); +} + +.monaco-workbench .part.editor > .content .gettingStartedContainer a:not(.hide-category-button):hover { + color: var(--vscode-textLink-activeForeground); +} + +.monaco-workbench .part.editor > .content .gettingStartedContainer a:not(.hide-category-button):active { + color: var(--vscode-textLink-activeForeground); +} + +.monaco-workbench .part.editor > .content .gettingStartedContainer button.button-link:hover { + color: var(--vscode-textLink-activeForeground); +} + +.monaco-workbench .part.editor > .content .gettingStartedContainer button.button-link:hover .codicon { + color: var(--vscode-textLink-activeForeground); +} + +.monaco-workbench .part.editor > .content .gettingStartedContainer a:not(.codicon-close):focus { + outline-color: var(--vscode-focusBorder); +} + +.monaco-workbench .part.editor > .content .gettingStartedContainer button { + border: 1px solid var(--vscode-contrastBorder); +} + +.monaco-workbench .part.editor > .content .gettingStartedContainer button.button-link { + border: inherit; +} + +.monaco-workbench .part.editor > .content .gettingStartedContainer .gettingStartedSlideCategories .progress-bar-outer { + background-color: var(--vscode-welcomePage-progress-background); +} + +.monaco-workbench .part.editor > .content .gettingStartedContainer .gettingStartedSlideCategories .progress-bar-inner { + background-color: var(--vscode-welcomePage-progress-foreground); +} + +.monaco-workbench .part.editor>.content .gettingStartedContainer .gettingStartedSlide .getting-started-category .new-badge { + color: var(--vscode-activityBarBadge-foreground); +} + +.monaco-workbench .part.editor>.content .gettingStartedContainer .gettingStartedSlide .getting-started-category .featured .featured-icon { + color: var(--vscode-activityBarBadge-foreground); +} + +.monaco-workbench .part.editor>.content .gettingStartedContainer .gettingStartedSlide .getting-started-category .new-badge { + background-color: var(--vscode-activityBarBadge-background); +} + +.monaco-workbench .part.editor>.content .gettingStartedContainer .gettingStartedSlide .getting-started-category .featured { + border-top-color: var(--vscode-activityBarBadge-background); +} + +.monaco-workbench .part.editor>.content .gettingStartedContainer .gettingStartedSlide .getting-started-checkbox { + background-color: var(--vscode-checkbox-background) !important; +} + +.monaco-workbench .part.editor>.content .gettingStartedContainer .gettingStartedSlide .getting-started-checkbox { + color: var(--vscode-checkbox-foreground) !important; +} + +.monaco-workbench .part.editor>.content .gettingStartedContainer .gettingStartedSlide .getting-started-checkbox { + border-color: var(--vscode-checkbox-border) !important; +} From ba9be48390636fd8f38ae706b4f87e0f79ba9d9f Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 2 Nov 2022 16:21:33 +0100 Subject: [PATCH 048/185] adopt `vscode.l10n` in references view (#165245) https://github.com/microsoft/vscode/issues/164438 --- extensions/references-view/package.json | 3 --- extensions/references-view/src/calls/model.ts | 10 ++++------ extensions/references-view/src/references/index.ts | 4 +--- extensions/references-view/src/references/model.ts | 14 ++++++-------- extensions/references-view/src/tree.ts | 12 +++++------- extensions/references-view/src/types/model.ts | 10 ++++------ 6 files changed, 20 insertions(+), 33 deletions(-) diff --git a/extensions/references-view/package.json b/extensions/references-view/package.json index d3fcadcbffd..f78334afb28 100644 --- a/extensions/references-view/package.json +++ b/extensions/references-view/package.json @@ -406,9 +406,6 @@ "compile": "npx gulp compile-extension:references-view", "watch": "npx gulp watch-extension:references-view" }, - "dependencies": { - "vscode-nls": "^5.2.0" - }, "devDependencies": { "@types/node": "16.x" } diff --git a/extensions/references-view/src/calls/model.ts b/extensions/references-view/src/calls/model.ts index 0efa35f4e02..ce8cbbcf973 100644 --- a/extensions/references-view/src/calls/model.ts +++ b/extensions/references-view/src/calls/model.ts @@ -6,8 +6,6 @@ import * as vscode from 'vscode'; import { SymbolItemDragAndDrop, SymbolItemEditorHighlights, SymbolItemNavigation, SymbolTreeInput } from '../references-view'; import { asResourceUrl, del, getThemeIcon, tail } from '../utils'; -import * as nls from 'vscode-nls'; -const localize = nls.loadMessageBundle(); export class CallsTreeInput implements SymbolTreeInput { @@ -19,8 +17,8 @@ export class CallsTreeInput implements SymbolTreeInput { readonly direction: CallsDirection, ) { this.title = direction === CallsDirection.Incoming - ? localize('title.callers', 'Callers Of') - : localize('title.calls', 'Calls From'); + ? vscode.l10n.t('Callers Of') + : vscode.l10n.t('Calls From'); } async resolve() { @@ -35,7 +33,7 @@ export class CallsTreeInput implements SymbolTreeInput { return { provider, - get message() { return model.roots.length === 0 ? localize('noresult', 'No results.') : undefined; }, + get message() { return model.roots.length === 0 ? vscode.l10n.t('No results.') : undefined; }, navigation: model, highlights: model, dnd: model, @@ -184,7 +182,7 @@ class CallItemDataProvider implements vscode.TreeDataProvider { item.iconPath = getThemeIcon(element.item.kind); item.command = { command: 'vscode.open', - title: localize('open', 'Open Call'), + title: vscode.l10n.t('Open Call'), arguments: [ element.item.uri, { selection: element.item.selectionRange.with({ end: element.item.selectionRange.start }) } diff --git a/extensions/references-view/src/references/index.ts b/extensions/references-view/src/references/index.ts index e54740dc66a..c4942f125b7 100644 --- a/extensions/references-view/src/references/index.ts +++ b/extensions/references-view/src/references/index.ts @@ -6,8 +6,6 @@ import * as vscode from 'vscode'; import { SymbolsTree } from '../tree'; import { FileItem, ReferenceItem, ReferencesModel, ReferencesTreeInput } from './model'; -import * as nls from 'vscode-nls'; -const localize = nls.loadMessageBundle(); export function register(tree: SymbolsTree, context: vscode.ExtensionContext): void { @@ -45,7 +43,7 @@ export function register(tree: SymbolsTree, context: vscode.ExtensionContext): v if (value === 'view') { showReferencesDisposable = vscode.commands.registerCommand('editor.action.showReferences', async (uri: vscode.Uri, position: vscode.Position, locations: vscode.Location[]) => { - const input = new ReferencesTreeInput(localize('title', 'References'), new vscode.Location(uri, position), 'vscode.executeReferenceProvider', locations); + const input = new ReferencesTreeInput(vscode.l10n.t('References'), new vscode.Location(uri, position), 'vscode.executeReferenceProvider', locations); tree.setInput(input); }); } diff --git a/extensions/references-view/src/references/model.ts b/extensions/references-view/src/references/model.ts index d9716d72dd6..83978565f20 100644 --- a/extensions/references-view/src/references/model.ts +++ b/extensions/references-view/src/references/model.ts @@ -6,8 +6,6 @@ import * as vscode from 'vscode'; import { SymbolItemDragAndDrop, SymbolItemEditorHighlights, SymbolItemNavigation, SymbolTreeInput, SymbolTreeModel } from '../references-view'; import { asResourceUrl, del, getPreviewChunks, tail } from '../utils'; -import * as nls from 'vscode-nls'; -const localize = nls.loadMessageBundle(); export class ReferencesTreeInput implements SymbolTreeInput { @@ -112,18 +110,18 @@ export class ReferencesModel implements SymbolItemNavigation prev + cur.references.length, 0); const files = this.items.length; if (total === 1 && files === 1) { - return localize('result.1', '{0} result in {1} file', total, files); + return vscode.l10n.t('{0} result in {1} file', total, files); } else if (total === 1) { - return localize('result.1n', '{0} result in {1} files', total, files); + return vscode.l10n.t('{0} result in {1} files', total, files); } else if (files === 1) { - return localize('result.n1', '{0} results in {1} file', total, files); + return vscode.l10n.t('{0} results in {1} file', total, files); } else { - return localize('result.nm', '{0} results in {1} files', total, files); + return vscode.l10n.t('{0} results in {1} files', total, files); } } @@ -299,7 +297,7 @@ class ReferencesTreeDataProvider implements vscode.TreeDataProvider{ selection: range.with({ end: range.start }) } diff --git a/extensions/references-view/src/tree.ts b/extensions/references-view/src/tree.ts index b46db07c9ba..0c005237d45 100644 --- a/extensions/references-view/src/tree.ts +++ b/extensions/references-view/src/tree.ts @@ -8,8 +8,6 @@ import { EditorHighlights } from './highlights'; import { Navigation } from './navigation'; import { SymbolItemDragAndDrop, SymbolTreeInput } from './references-view'; import { ContextKey, isValidRequestPosition, WordAnchor } from './utils'; -import * as nls from 'vscode-nls'; -const localize = nls.loadMessageBundle(); export class SymbolsTree { @@ -123,10 +121,10 @@ export class SymbolsTree { this._input = undefined; this._ctxHasResult.set(false); this._ctxInputSource.reset(); - this._tree.title = localize('title', 'References'); + this._tree.title = vscode.l10n.t('References'); this._tree.message = this._history.size === 0 - ? localize('noresult', 'No results.') - : localize('noresult2', 'No results. Try running a previous search again:'); + ? vscode.l10n.t('No results.') + : vscode.l10n.t('No results. Try running a previous search again:'); this._provider.update(Promise.resolve(this._history)); } } @@ -283,7 +281,7 @@ class TreeInputHistory implements vscode.TreeDataProvider{ description: item.description, item }); - const pick = await vscode.window.showQuickPick(picks, { placeHolder: localize('placeholder', 'Select previous reference search') }); + const pick = await vscode.window.showQuickPick(picks, { placeHolder: vscode.l10n.t('Select previous reference search') }); if (pick) { this._reRunHistoryItem(pick.item); } @@ -338,7 +336,7 @@ class TreeInputHistory implements vscode.TreeDataProvider{ getTreeItem(item: HistoryItem): vscode.TreeItem { const result = new vscode.TreeItem(item.word); result.description = item.description; - result.command = { command: '_references-view.showHistoryItem', arguments: [item], title: localize('title.rerun', 'Rerun') }; + result.command = { command: '_references-view.showHistoryItem', arguments: [item], title: vscode.l10n.t('Rerun') }; result.collapsibleState = vscode.TreeItemCollapsibleState.None; result.contextValue = 'history-item'; return result; diff --git a/extensions/references-view/src/types/model.ts b/extensions/references-view/src/types/model.ts index 31bbe9403e3..89dd001df55 100644 --- a/extensions/references-view/src/types/model.ts +++ b/extensions/references-view/src/types/model.ts @@ -6,8 +6,6 @@ import * as vscode from 'vscode'; import { SymbolItemDragAndDrop, SymbolItemEditorHighlights, SymbolItemNavigation, SymbolTreeInput } from '../references-view'; import { asResourceUrl, del, getThemeIcon, tail } from '../utils'; -import * as nls from 'vscode-nls'; -const localize = nls.loadMessageBundle(); export class TypesTreeInput implements SymbolTreeInput { @@ -19,8 +17,8 @@ export class TypesTreeInput implements SymbolTreeInput { readonly direction: TypeHierarchyDirection, ) { this.title = direction === TypeHierarchyDirection.Supertypes - ? localize('title.sup', 'Supertypes Of') - : localize('title.sub', 'Subtypes Of'); + ? vscode.l10n.t('Supertypes Of') + : vscode.l10n.t('Subtypes Of'); } async resolve() { @@ -35,7 +33,7 @@ export class TypesTreeInput implements SymbolTreeInput { return { provider, - get message() { return model.roots.length === 0 ? localize('noresult', 'No results.') : undefined; }, + get message() { return model.roots.length === 0 ? vscode.l10n.t('No results.') : undefined; }, navigation: model, highlights: model, dnd: model, @@ -176,7 +174,7 @@ class TypeItemDataProvider implements vscode.TreeDataProvider { item.iconPath = getThemeIcon(element.item.kind); item.command = { command: 'vscode.open', - title: localize('title.openType', 'Open Type'), + title: vscode.l10n.t('Open Type'), arguments: [ element.item.uri, { selection: element.item.selectionRange.with({ end: element.item.selectionRange.start }) } From f6f944e7ed2289f9ee4a988772d5a40f63a06e65 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 2 Nov 2022 16:43:55 +0100 Subject: [PATCH 049/185] report perf marks whenever delivered (#165250) --- .../services/timer/browser/timerService.ts | 44 +++++++++---------- 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/src/vs/workbench/services/timer/browser/timerService.ts b/src/vs/workbench/services/timer/browser/timerService.ts index 07aea8e7518..1d8c7f54048 100644 --- a/src/vs/workbench/services/timer/browser/timerService.ts +++ b/src/vs/workbench/services/timer/browser/timerService.ts @@ -547,7 +547,9 @@ export abstract class AbstractTimerService implements ITimerService { setPerformanceMarks(source: string, marks: perf.PerformanceMark[]): void { // Perf marks are a shared resource because anyone can generate them // and because of that we only accept marks that start with 'code/' - this._marks.setMarks(source, marks.filter(mark => mark.name.startsWith('code/'))); + const codeMarks = marks.filter(mark => mark.name.startsWith('code/')); + this._marks.setMarks(source, codeMarks); + this._reportPerformanceMarks(source, codeMarks); } getPerformanceMarks(): [source: string, marks: readonly perf.PerformanceMark[]][] { @@ -565,34 +567,30 @@ export abstract class AbstractTimerService implements ITimerService { } */ this._telemetryService.publicLog('startupTimeVaried', metrics); + } - + private _reportPerformanceMarks(source: string, marks: perf.PerformanceMark[]) { // report raw timers as telemetry. each mark is send a separate telemetry // event and it is "normalized" to a relative timestamp where the first mark // defines the start - for (const [source, marks] of this.getPerformanceMarks()) { - type Mark = { source: string; name: string; relativeStartTime: number; startTime: number }; - type MarkClassification = { - owner: 'jrieken'; - comment: 'Information about a performance marker'; - source: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth'; comment: 'Where this marker was generated, e.g main, renderer, extension host' }; - name: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth'; comment: 'The name of this marker (as defined in source code)' }; - relativeStartTime: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth'; isMeasurement: true; comment: 'The duration between the previous and this marker' }; - startTime: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth'; isMeasurement: true; comment: 'The absolute timestamp (unix time)' }; - }; - let lastMark: perf.PerformanceMark = marks[0]; - for (const mark of marks) { - const delta = mark.startTime - lastMark.startTime; - this._telemetryService.publicLog2('startup.timer.mark', { - source, - name: mark.name, - relativeStartTime: delta, - startTime: mark.startTime - }); - lastMark = mark; - } + type Mark = { source: string; name: string; startTime: number }; + type MarkClassification = { + owner: 'jrieken'; + comment: 'Information about a performance marker'; + source: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth'; comment: 'Where this marker was generated, e.g main, renderer, extension host' }; + name: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth'; comment: 'The name of this marker (as defined in source code)' }; + startTime: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth'; isMeasurement: true; comment: 'The absolute timestamp (unix time)' }; + }; + + for (const mark of marks) { + this._telemetryService.publicLog2('startup.timer.mark', { + source, + name: mark.name, + startTime: mark.startTime + }); } + } private async _computeStartupMetrics(): Promise { From db1c4d4f85c9171e3a938fb4ec369fb3bc7d23af Mon Sep 17 00:00:00 2001 From: SphinxKnight Date: Wed, 2 Nov 2022 17:00:13 +0100 Subject: [PATCH 050/185] Nit: fix Tip blocks case (#165223) --- .../browser/editor/vs_code_editor_walkthrough.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/contrib/welcomeWalkthrough/browser/editor/vs_code_editor_walkthrough.ts b/src/vs/workbench/contrib/welcomeWalkthrough/browser/editor/vs_code_editor_walkthrough.ts index 8d2aa6b88f4..aa12c53b2b5 100644 --- a/src/vs/workbench/contrib/welcomeWalkthrough/browser/editor/vs_code_editor_walkthrough.ts +++ b/src/vs/workbench/contrib/welcomeWalkthrough/browser/editor/vs_code_editor_walkthrough.ts @@ -40,7 +40,7 @@ That is the tip of the iceberg for multi-cursor editing. Have a look at the sele #p3 {background-color: rgba(0, 4, 255, 0.733);} /* blue with alpha channel in RGBA format */ ||| -> **CSS Tip:** you may have noticed in the example above we also provide color swatches inline for CSS, additionally if you hover over an element such as |#p1| we will show how this is represented in HTML. These swatches also act as color pickers that allow you to easily change a color value. A simple example of some language-specific editor features. +> **CSS Tip:** You may have noticed in the example above we also provide color swatches inline for CSS, additionally if you hover over an element such as |#p1| we will show how this is represented in HTML. These swatches also act as color pickers that allow you to easily change a color value. A simple example of some language-specific editor features. ### IntelliSense @@ -54,7 +54,7 @@ context.strokeStyle = 'blue'; context. ||| ->**Tip:** while we ship JavaScript and TypeScript support out of the box other languages can be upgraded with better IntelliSense through one of the many [extensions](command:workbench.extensions.action.showPopularExtensions). +>**Tip:** While we ship JavaScript and TypeScript support out of the box other languages can be upgraded with better IntelliSense through one of the many [extensions](command:workbench.extensions.action.showPopularExtensions). ### Line Actions @@ -153,7 +153,7 @@ You can greatly accelerate your editing through the use of snippets. Simply sta ||| ->**Tip:** the [extension gallery](command:workbench.extensions.action.showPopularExtensions) includes snippets for almost every framework and language imaginable. You can also create your own [user-defined snippets](command:workbench.action.openSnippets). +>**Tip:** The [extension gallery](command:workbench.extensions.action.showPopularExtensions) includes snippets for almost every framework and language imaginable. You can also create your own [user-defined snippets](command:workbench.action.openSnippets). ### Emmet From 6aaf830b9cfacd7e100fc0e5a59bf924580db75d Mon Sep 17 00:00:00 2001 From: Logan Ramos Date: Wed, 2 Nov 2022 12:05:41 -0400 Subject: [PATCH 051/185] Fix some cases of incremental naming disabled (#165253) --- .../contrib/files/browser/fileActions.ts | 38 ++++++++++++++----- .../files/browser/views/explorerViewer.ts | 18 ++++++++- 2 files changed, 45 insertions(+), 11 deletions(-) diff --git a/src/vs/workbench/contrib/files/browser/fileActions.ts b/src/vs/workbench/contrib/files/browser/fileActions.ts index b1f29827fbb..07ef6bb021e 100644 --- a/src/vs/workbench/contrib/files/browser/fileActions.ts +++ b/src/vs/workbench/contrib/files/browser/fileActions.ts @@ -301,10 +301,26 @@ function containsBothDirectoryAndFile(distinctElements: ExplorerItem[]): boolean } -export function findValidPasteFileTarget(explorerService: IExplorerService, targetFolder: ExplorerItem, fileToPaste: { resource: URI; isDirectory?: boolean; allowOverwrite: boolean }, incrementalNaming: 'simple' | 'smart' | 'disabled'): URI { - let name = resources.basenameOrAuthority(fileToPaste.resource); +export async function findValidPasteFileTarget( + explorerService: IExplorerService, + fileService: IFileService, + dialogService: IDialogService, + targetFolder: ExplorerItem, + fileToPaste: { resource: URI; isDirectory?: boolean; allowOverwrite: boolean }, + incrementalNaming: 'simple' | 'smart' | 'disabled' +): Promise { + let name = resources.basenameOrAuthority(fileToPaste.resource); let candidate = resources.joinPath(targetFolder.resource, name); + + // In the disabled case we must ask if it's ok to overwrite the file if it exists + if (incrementalNaming === 'disabled') { + const canOverwrite = await askForOverwrite(fileService, dialogService, candidate); + if (!canOverwrite) { + return; + } + } + while (true && !fileToPaste.allowOverwrite) { if (!explorerService.findClosest(candidate)) { break; @@ -1064,13 +1080,17 @@ export const pasteFileHandler = async (accessor: ServicesAccessor) => { target = element.isDirectory ? element : element.parent!; } - const targetFile = findValidPasteFileTarget(explorerService, target, { resource: fileToPaste, isDirectory: fileToPasteStat.isDirectory, allowOverwrite: pasteShouldMove || incrementalNaming === 'disabled' }, incrementalNaming); + const targetFile = await findValidPasteFileTarget( + explorerService, + fileService, + dialogService, + target, + { resource: fileToPaste, isDirectory: fileToPasteStat.isDirectory, allowOverwrite: pasteShouldMove || incrementalNaming === 'disabled' }, + incrementalNaming + ); - if (incrementalNaming === 'disabled') { - const canOverwrite = await askForOverwrite(fileService, dialogService, targetFile); - if (!canOverwrite) { - return; - } + if (!targetFile) { + return undefined; } return { source: fileToPaste, target: targetFile }; @@ -1079,7 +1099,7 @@ export const pasteFileHandler = async (accessor: ServicesAccessor) => { if (sourceTargetPairs.length >= 1) { // Move/Copy File if (pasteShouldMove) { - const resourceFileEdits = sourceTargetPairs.map(pair => new ResourceFileEdit(pair.source, pair.target)); + const resourceFileEdits = sourceTargetPairs.map(pair => new ResourceFileEdit(pair.source, pair.target, { overwrite: incrementalNaming === 'disabled' })); const options = { confirmBeforeUndo: configurationService.getValue().explorer.confirmUndo === UndoConfirmLevel.Verbose, progressLabel: sourceTargetPairs.length > 1 ? nls.localize({ key: 'movingBulkEdit', comment: ['Placeholder will be replaced by the number of files being moved'] }, "Moving {0} files", sourceTargetPairs.length) diff --git a/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts b/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts index 0cc3b679ced..1fe7a698f73 100644 --- a/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts +++ b/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts @@ -1276,8 +1276,22 @@ export class FileDragAndDrop implements ITreeDragAndDrop { // Reuse duplicate action when user copies const explorerConfig = this.configurationService.getValue().explorer; - const resourceFileEdits = sources.map(({ resource, isDirectory }) => - (new ResourceFileEdit(resource, findValidPasteFileTarget(this.explorerService, target, { resource, isDirectory, allowOverwrite: false }, explorerConfig.incrementalNaming), { copy: true }))); + const resourceFileEdits: ResourceFileEdit[] = []; + for (const { resource, isDirectory } of sources) { + const allowOverwrite = explorerConfig.incrementalNaming === 'disabled'; + const newResource = await findValidPasteFileTarget(this.explorerService, + this.fileService, + this.dialogService, + target, + { resource, isDirectory, allowOverwrite }, + explorerConfig.incrementalNaming + ); + if (!newResource) { + continue; + } + const resourceEdit = new ResourceFileEdit(resource, newResource, { copy: true, overwrite: allowOverwrite }); + resourceFileEdits.push(resourceEdit); + } const labelSufix = getFileOrFolderLabelSufix(sources); await this.explorerService.applyBulkEdit(resourceFileEdits, { confirmBeforeUndo: explorerConfig.confirmUndo === UndoConfirmLevel.Default || explorerConfig.confirmUndo === UndoConfirmLevel.Verbose, From c36c93a37da6cd451b7dc88472042c4bae5fed37 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 2 Nov 2022 09:26:49 -0700 Subject: [PATCH 052/185] Let opener service validate that only specific commands can be run in command uris (#165204) --- .../editor/browser/services/openerService.ts | 14 +++++- .../browser/markdownRenderer.ts | 45 +++++++------------ src/vs/platform/opener/common/opener.ts | 4 +- .../view/renderers/backLayerWebView.ts | 43 +++++++++--------- 4 files changed, 54 insertions(+), 52 deletions(-) diff --git a/src/vs/editor/browser/services/openerService.ts b/src/vs/editor/browser/services/openerService.ts index 8b751e86828..e329d0eea4d 100644 --- a/src/vs/editor/browser/services/openerService.ts +++ b/src/vs/editor/browser/services/openerService.ts @@ -25,15 +25,25 @@ class CommandOpener implements IOpener { if (!matchesScheme(target, Schemas.command)) { return false; } + if (!options?.allowCommands) { // silently ignore commands when command-links are disabled, also - // surpress other openers by returning TRUE + // suppress other openers by returning TRUE return true; } - // run command or bail out if command isn't known + if (typeof target === 'string') { target = URI.parse(target); } + + if (Array.isArray(options.allowCommands)) { + // Only allow specific commands + if (!options.allowCommands.includes(target.path)) { + // Suppress other openers by returning TRUE + return true; + } + } + // execute as command let args: any = []; try { diff --git a/src/vs/editor/contrib/markdownRenderer/browser/markdownRenderer.ts b/src/vs/editor/contrib/markdownRenderer/browser/markdownRenderer.ts index 4f4141d5301..639b238809e 100644 --- a/src/vs/editor/contrib/markdownRenderer/browser/markdownRenderer.ts +++ b/src/vs/editor/contrib/markdownRenderer/browser/markdownRenderer.ts @@ -8,8 +8,6 @@ import { onUnexpectedError } from 'vs/base/common/errors'; import { Emitter } from 'vs/base/common/event'; import { IMarkdownString, MarkdownStringTrustedOptions } from 'vs/base/common/htmlContent'; import { DisposableStore, IDisposable } from 'vs/base/common/lifecycle'; -import { Schemas } from 'vs/base/common/network'; -import { URI } from 'vs/base/common/uri'; import { applyFontInfo } from 'vs/editor/browser/config/domFontInfo'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; @@ -112,35 +110,26 @@ export class MarkdownRenderer { } export async function openLinkFromMarkdown(openerService: IOpenerService, link: string, isTrusted: boolean | MarkdownStringTrustedOptions | undefined): Promise { - let allowCommands = false; - if (isTrusted) { - try { - const uri = URI.parse(link); - if (uri.scheme === Schemas.command) { - if (typeof isTrusted === 'boolean') { - if (!isTrusted) { - return false; - } - - allowCommands = true; - } else { - // Only allow a subset of commands - if (!isTrusted.enabledCommands.includes(uri.path)) { - return false; - } - - allowCommands = true; - } - } - } catch { - // noop - } - } - try { - return await openerService.open(link, { fromUserGesture: true, allowContributedOpeners: true, allowCommands }); + return await openerService.open(link, { + fromUserGesture: true, + allowContributedOpeners: true, + allowCommands: toAllowCommandsOption(isTrusted), + }); } catch (e) { onUnexpectedError(e); return false; } } + +function toAllowCommandsOption(isTrusted: boolean | MarkdownStringTrustedOptions | undefined): boolean | readonly string[] { + if (isTrusted === true) { + return true; // Allow all commands + } + + if (isTrusted && Array.isArray(isTrusted.enabledCommands)) { + return isTrusted.enabledCommands; // Allow subset of commands + } + + return false; // Block commands +} diff --git a/src/vs/platform/opener/common/opener.ts b/src/vs/platform/opener/common/opener.ts index ce203854888..7478cafd3ab 100644 --- a/src/vs/platform/opener/common/opener.ts +++ b/src/vs/platform/opener/common/opener.ts @@ -33,8 +33,10 @@ export type OpenInternalOptions = { /** * Allow command links to be handled. + * + * If this is an array, then only the commands included in the array can be run. */ - readonly allowCommands?: boolean; + readonly allowCommands?: boolean | readonly string[]; }; export type OpenExternalOptions = { diff --git a/src/vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView.ts b/src/vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView.ts index 2dd84aeee17..6803f396bcf 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView.ts @@ -682,35 +682,36 @@ var requirejs = (function() { break; } case 'clicked-link': { - let linkToOpen: URI | string | undefined; - if (matchesScheme(data.href, Schemas.command)) { - // We allow a very limited set of commands const uri = URI.parse(data.href); - switch (uri.path) { - case 'workbench.action.openLargeOutput': { - const outputId = uri.query; - const group = this.editorGroupService.activeGroup; - if (group) { - if (group.activeEditor) { - group.pinEditor(group.activeEditor); - } - } - this.openerService.open(CellUri.generateCellOutputUri(this.documentUri, outputId)); - return; - } - case 'github-issues.authNow': - case 'workbench.extensions.search': - case 'workbench.action.openSettings': { - this.openerService.open(data.href, { fromUserGesture: true, allowCommands: true, fromWorkspace: true }); - return; + if (uri.path === 'workbench.action.openLargeOutput') { + const outputId = uri.query; + const group = this.editorGroupService.activeGroup; + if (group) { + if (group.activeEditor) { + group.pinEditor(group.activeEditor); + } } + + this.openerService.open(CellUri.generateCellOutputUri(this.documentUri, outputId)); + return; } + // We allow a very limited set of commands + this.openerService.open(data.href, { + fromUserGesture: true, + fromWorkspace: true, + allowCommands: [ + 'github-issues.authNow', + 'workbench.extensions.search', + 'workbench.action.openSettings', + ], + }); return; } + let linkToOpen: URI | string | undefined; if (matchesSomeScheme(data.href, Schemas.http, Schemas.https, Schemas.mailto, Schemas.vscodeNotebookCell, Schemas.vscodeNotebook)) { linkToOpen = data.href; } else if (!/^[\w\-]+:/.test(data.href)) { @@ -742,7 +743,7 @@ var requirejs = (function() { } if (linkToOpen) { - this.openerService.open(linkToOpen, { fromUserGesture: true, allowCommands: false, fromWorkspace: true }); + this.openerService.open(linkToOpen, { fromUserGesture: true, fromWorkspace: true }); } break; } From 1b83b96a4658097d1939f0b6ec68823197340a00 Mon Sep 17 00:00:00 2001 From: Joyce Er Date: Wed, 2 Nov 2022 09:36:56 -0700 Subject: [PATCH 053/185] Save all dirty editors before storing edit session (#165246) --- .../browser/editSessions.contribution.ts | 13 +++++++------ .../editSessions/test/browser/editSessions.test.ts | 4 ++++ 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/vs/workbench/contrib/editSessions/browser/editSessions.contribution.ts b/src/vs/workbench/contrib/editSessions/browser/editSessions.contribution.ts index fa4c9f09666..956c721efe9 100644 --- a/src/vs/workbench/contrib/editSessions/browser/editSessions.contribution.ts +++ b/src/vs/workbench/contrib/editSessions/browser/editSessions.contribution.ts @@ -56,6 +56,7 @@ import * as Constants from 'vs/workbench/contrib/logs/common/logConstants'; import { sha1Hex } from 'vs/base/browser/hash'; import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; import { IActivityService, NumberBadge } from 'vs/workbench/services/activity/common/activity'; +import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; registerSingleton(IEditSessionsLogService, EditSessionsLogService, InstantiationType.Delayed); registerSingleton(IEditSessionsStorageService, EditSessionsWorkbenchService, InstantiationType.Delayed); @@ -117,6 +118,7 @@ export class EditSessionsContribution extends Disposable implements IWorkbenchCo @ILifecycleService private readonly lifecycleService: ILifecycleService, @IStorageService private readonly storageService: IStorageService, @IActivityService private readonly activityService: IActivityService, + @IEditorService private readonly editorService: IEditorService, ) { super(); @@ -295,11 +297,7 @@ export class EditSessionsContribution extends Disposable implements IWorkbenchCo // Run the store action to get back a ref let ref: string | undefined; if (shouldStoreEditSession) { - ref = await that.progressService.withProgress({ - location: ProgressLocation.Notification, - type: 'syncing', - title: localize('store your edit session', 'Storing your edit session...') - }, async () => that.storeEditSession(false)); + ref = await that.storeEditSession(false); } let uri = workspaceUri ?? await that.pickContinueEditSessionDestination(); @@ -408,7 +406,7 @@ export class EditSessionsContribution extends Disposable implements IWorkbenchCo } else if (ref !== undefined) { this.notificationService.warn(localize('no edit session content for ref', 'Could not resume edit session contents for ID {0}.', ref)); } - this.logService.info(ref !== undefined ? `Aborting resuming edit session as no edit session content is available to be applied from ref ${ref}.` : `Aborting resuming edit session as no edit session content is available to be applied`); + this.logService.info(`Aborting resuming edit session as no edit session content is available to be applied from ref ${ref}.`); return; } const editSession = data.editSession; @@ -562,6 +560,9 @@ export class EditSessionsContribution extends Disposable implements IWorkbenchCo const folders: Folder[] = []; let hasEdits = false; + // Save all saveable editors before building edit session contents + await this.editorService.saveAll(); + for (const repository of this.scmService.repositories) { // Look through all resource groups and compute which files were added/modified/deleted const trackedUris = this.getChangedResources(repository); // A URI might appear in more than one resource group diff --git a/src/vs/workbench/contrib/editSessions/test/browser/editSessions.test.ts b/src/vs/workbench/contrib/editSessions/test/browser/editSessions.test.ts index 3bcd8b1d946..b4d87f01b53 100644 --- a/src/vs/workbench/contrib/editSessions/test/browser/editSessions.test.ts +++ b/src/vs/workbench/contrib/editSessions/test/browser/editSessions.test.ts @@ -36,6 +36,7 @@ import { IViewDescriptorService } from 'vs/workbench/common/views'; import { ITextModelService } from 'vs/editor/common/services/resolverService'; import { ILifecycleService } from 'vs/workbench/services/lifecycle/common/lifecycle'; import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; +import { IEditorService, ISaveAllEditorsOptions } from 'vs/workbench/services/editor/common/editorService'; const folderName = 'test-folder'; const folderUri = URI.file(`/${folderName}`); @@ -109,6 +110,9 @@ suite('Edit session sync', () => { instantiationService.stub(ITextModelService, new class extends mock() { override registerTextModelContentProvider = () => ({ dispose: () => { } }); }); + instantiationService.stub(IEditorService, new class extends mock() { + override saveAll = async (_options: ISaveAllEditorsOptions) => true; + }); editSessionsContribution = instantiationService.createInstance(EditSessionsContribution); }); From 469ee9360deb1ae8f6a9d69db3753568dcbce398 Mon Sep 17 00:00:00 2001 From: Megan Rogge Date: Wed, 2 Nov 2022 12:41:28 -0400 Subject: [PATCH 054/185] don't set quick pick items every time value changes (#165113) --- src/vs/platform/quickinput/browser/quickPickPin.ts | 8 ++++++-- src/vs/workbench/contrib/tasks/browser/taskQuickPick.ts | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/vs/platform/quickinput/browser/quickPickPin.ts b/src/vs/platform/quickinput/browser/quickPickPin.ts index 7951674b109..6ae4fd5a94c 100644 --- a/src/vs/platform/quickinput/browser/quickPickPin.ts +++ b/src/vs/platform/quickinput/browser/quickPickPin.ts @@ -30,9 +30,13 @@ export async function showWithPinnedItems(storageService: IStorageService, stora } }); quickPick.onDidChangeValue(async value => { - // Return pinned items if there is no search value - quickPick.items = value ? itemsWithoutPinned : itemsWithPinned; + // If the items are pinnable (top level quick pick), update items such that + // pinned are excluded from the search results + if (quickPick.items.some(i => i.buttons?.some(b => b.iconClass === pinButtonClass))) { + quickPick.items = value ? itemsWithoutPinned : itemsWithPinned; + } }); + quickPick.items = quickPick.value ? itemsWithoutPinned : itemsWithPinned; quickPick.show(); } diff --git a/src/vs/workbench/contrib/tasks/browser/taskQuickPick.ts b/src/vs/workbench/contrib/tasks/browser/taskQuickPick.ts index d968ffeae56..011726462fd 100644 --- a/src/vs/workbench/contrib/tasks/browser/taskQuickPick.ts +++ b/src/vs/workbench/contrib/tasks/browser/taskQuickPick.ts @@ -284,8 +284,8 @@ export class TaskQuickPick extends Disposable { // Proceed to second level of quick pick if (selectedEntry && !selectedEntry.settingType && selectedEntry.task === null) { // The user has chosen to go back to the first level - firstLevelTask = await this._doPickerFirstLevel(picker, (await this.getTopLevelEntries(defaultEntry)).entries); picker.value = ''; + firstLevelTask = await this._doPickerFirstLevel(picker, (await this.getTopLevelEntries(defaultEntry)).entries); } else if (selectedEntry && Types.isString(selectedEntry.settingType)) { picker.dispose(); return this.handleSettingOption(selectedEntry.settingType); From 86b8ed4649d338758c8f1250811f9f7704fc1fc1 Mon Sep 17 00:00:00 2001 From: Logan Ramos Date: Wed, 2 Nov 2022 15:37:50 -0400 Subject: [PATCH 055/185] Fix autoreveal on file nest (#165272) --- src/vs/workbench/contrib/files/browser/views/explorerView.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/vs/workbench/contrib/files/browser/views/explorerView.ts b/src/vs/workbench/contrib/files/browser/views/explorerView.ts index 00239ee089c..7b0e72e16f5 100644 --- a/src/vs/workbench/contrib/files/browser/views/explorerView.ts +++ b/src/vs/workbench/contrib/files/browser/views/explorerView.ts @@ -761,6 +761,11 @@ export class ExplorerView extends ViewPane implements IExplorerView { } try { + // We must expand the nest to have it be populated in the tree + if (item.nestedParent) { + await this.tree.expand(item.nestedParent); + } + if (reveal === true && this.tree.getRelativeTop(item) === null) { // Don't scroll to the item if it's already visible, or if set not to. this.tree.reveal(item, 0.5); From d1624fc87e4ca3360dfcc9c550f33ec5fea53503 Mon Sep 17 00:00:00 2001 From: Megan Rogge Date: Wed, 2 Nov 2022 16:53:46 -0400 Subject: [PATCH 056/185] skip resolve (without backup) test (#165277) --- .../workingCopy/test/browser/storedFileWorkingCopy.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/services/workingCopy/test/browser/storedFileWorkingCopy.test.ts b/src/vs/workbench/services/workingCopy/test/browser/storedFileWorkingCopy.test.ts index 4dc6c6e598b..2a12942a085 100644 --- a/src/vs/workbench/services/workingCopy/test/browser/storedFileWorkingCopy.test.ts +++ b/src/vs/workbench/services/workingCopy/test/browser/storedFileWorkingCopy.test.ts @@ -228,7 +228,7 @@ suite('StoredFileWorkingCopy', function () { assert.strictEqual(workingCopy.isDirty(), false); }); - test('resolve (without backup)', async () => { + test.skip('resolve (without backup)', async () => { let onDidResolveCounter = 0; workingCopy.onDidResolve(() => { onDidResolveCounter++; From 9545edf1dc695ee60d0714bc0e02b1c31c8b5ab5 Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Wed, 2 Nov 2022 22:44:13 +0100 Subject: [PATCH 057/185] TestInstantiationService in fileDialogService.test.ts (#165270) Part of #164297 --- .../services/dialogs/browser/abstractFileDialogService.ts | 4 ++-- .../services/dialogs/browser/simpleFileDialog.ts | 7 ++++++- .../test/electron-sandbox/fileDialogService.test.ts | 8 ++++---- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/vs/workbench/services/dialogs/browser/abstractFileDialogService.ts b/src/vs/workbench/services/dialogs/browser/abstractFileDialogService.ts index 2282c22ec86..ef155de5707 100644 --- a/src/vs/workbench/services/dialogs/browser/abstractFileDialogService.ts +++ b/src/vs/workbench/services/dialogs/browser/abstractFileDialogService.ts @@ -12,7 +12,7 @@ import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/ import { URI } from 'vs/base/common/uri'; import * as resources from 'vs/base/common/resources'; import { IInstantiationService, } from 'vs/platform/instantiation/common/instantiation'; -import { SimpleFileDialog } from 'vs/workbench/services/dialogs/browser/simpleFileDialog'; +import { ISimpleFileDialog, SimpleFileDialog } from 'vs/workbench/services/dialogs/browser/simpleFileDialog'; import { IWorkspacesService } from 'vs/platform/workspaces/common/workspaces'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IFileService } from 'vs/platform/files/common/files'; @@ -262,7 +262,7 @@ export abstract class AbstractFileDialogService implements IFileDialogService { return uri ? [uri] : undefined; } - protected getSimpleFileDialog(): SimpleFileDialog { + protected getSimpleFileDialog(): ISimpleFileDialog { return this.instantiationService.createInstance(SimpleFileDialog); } diff --git a/src/vs/workbench/services/dialogs/browser/simpleFileDialog.ts b/src/vs/workbench/services/dialogs/browser/simpleFileDialog.ts index 71a00acb593..09a171641cb 100644 --- a/src/vs/workbench/services/dialogs/browser/simpleFileDialog.ts +++ b/src/vs/workbench/services/dialogs/browser/simpleFileDialog.ts @@ -100,7 +100,12 @@ enum UpdateResult { export const RemoteFileDialogContext = new RawContextKey('remoteFileDialogVisible', false); -export class SimpleFileDialog { +export interface ISimpleFileDialog { + showOpenDialog(options: IOpenDialogOptions): Promise; + showSaveDialog(options: ISaveDialogOptions): Promise; +} + +export class SimpleFileDialog implements ISimpleFileDialog { private options!: IOpenDialogOptions; private currentFolder!: URI; private filePickBox!: IQuickPick; diff --git a/src/vs/workbench/services/dialogs/test/electron-sandbox/fileDialogService.test.ts b/src/vs/workbench/services/dialogs/test/electron-sandbox/fileDialogService.test.ts index d8ab94017c1..e97abfe944e 100644 --- a/src/vs/workbench/services/dialogs/test/electron-sandbox/fileDialogService.test.ts +++ b/src/vs/workbench/services/dialogs/test/electron-sandbox/fileDialogService.test.ts @@ -28,7 +28,7 @@ import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace import { IWorkspacesService } from 'vs/platform/workspaces/common/workspaces'; import { IHistoryService } from 'vs/workbench/services/history/common/history'; import { IHostService } from 'vs/workbench/services/host/browser/host'; -import { SimpleFileDialog } from 'vs/workbench/services/dialogs/browser/simpleFileDialog'; +import { ISimpleFileDialog } from 'vs/workbench/services/dialogs/browser/simpleFileDialog'; import { ICommandService } from 'vs/platform/commands/common/commands'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; @@ -37,7 +37,7 @@ import { ILogService } from 'vs/platform/log/common/log'; class TestFileDialogService extends FileDialogService { constructor( - private simple: SimpleFileDialog, + private simple: ISimpleFileDialog, @IHostService hostService: IHostService, @IWorkspaceContextService contextService: IWorkspaceContextService, @IHistoryService historyService: IHistoryService, @@ -90,7 +90,7 @@ suite('FileDialogService', function () { }); test('Local - open/save workspaces availableFilesystems', async function () { - class TestSimpleFileDialog { + class TestSimpleFileDialog implements ISimpleFileDialog { async showOpenDialog(options: IOpenDialogOptions): Promise { assert.strictEqual(options.availableFileSystems?.length, 1); assert.strictEqual(options.availableFileSystems[0], Schemas.file); @@ -136,7 +136,7 @@ suite('FileDialogService', function () { }); test('Remote - open/save workspaces availableFilesystems', async function () { - class TestSimpleFileDialog { + class TestSimpleFileDialog implements ISimpleFileDialog { async showOpenDialog(options: IOpenDialogOptions): Promise { assert.strictEqual(options.availableFileSystems?.length, 2); assert.strictEqual(options.availableFileSystems[0], Schemas.vscodeRemote); From 14d922cd51a8c6d4558bf249894c17326a652966 Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Wed, 2 Nov 2022 22:44:37 +0100 Subject: [PATCH 058/185] Duplicating Menu Actions when switching profiles (#165274) Fixes #161910 --- src/vs/workbench/api/browser/viewsExtensionPoint.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/vs/workbench/api/browser/viewsExtensionPoint.ts b/src/vs/workbench/api/browser/viewsExtensionPoint.ts index 87e69afc783..73df44c84be 100644 --- a/src/vs/workbench/api/browser/viewsExtensionPoint.ts +++ b/src/vs/workbench/api/browser/viewsExtensionPoint.ts @@ -573,6 +573,12 @@ class ViewsExtensionHandler implements IWorkbenchContribution { const removedViews = this.viewsRegistry.getViews(viewContainer).filter(v => (v as ICustomViewDescriptor).extensionId && removedExtensions.has(ExtensionIdentifier.toKey((v as ICustomViewDescriptor).extensionId))); if (removedViews.length) { this.viewsRegistry.deregisterViews(removedViews, viewContainer); + for (const view of removedViews) { + const anyView = view as ICustomTreeViewDescriptor; + if (anyView.treeView) { + anyView.treeView.dispose(); + } + } } } } From 9c0c68c8cfd9341b8e345e409c5b434e5b80e14e Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 2 Nov 2022 22:48:15 +0100 Subject: [PATCH 059/185] Fix #164690 #164730 (#165279) - Maintain default installed extensions manifest always - Adopt to default installed extensions manifest - Add externally installed extension to default extensions manifest --- .../sharedProcess/contrib/extensions.ts | 33 +++ .../contrib/extensionsCleaner.ts | 186 ------------- .../sharedProcess/sharedProcessMain.ts | 4 +- src/vs/code/electron-main/app.ts | 4 - src/vs/code/node/cliProcessMain.ts | 2 +- .../abstractExtensionManagementService.ts | 103 +++----- .../common/extensionManagement.ts | 3 +- .../common/extensionsProfileScannerService.ts | 2 +- .../common/extensionsScannerService.ts | 5 +- .../defaultExtensionsProfileInit.ts | 57 ---- .../node/extensionManagementService.ts | 173 ++++++------- .../node/extensionsWatcher.ts | 245 +++++++++++------- .../browser/userDataProfile.ts | 1 - .../userDataProfile/common/userDataProfile.ts | 12 +- .../common/userDataProfileService.test.ts | 5 +- .../userDataProfileMainService.test.ts | 4 - .../userDataSync/common/extensionsSync.ts | 14 +- .../common/userDataProfilesManifestSync.ts | 18 +- .../common/userDataSyncService.ts | 13 - .../server/node/remoteAgentEnvironmentImpl.ts | 3 + src/vs/server/node/serverServices.ts | 4 +- .../extensions/browser/extensionsActions.ts | 3 +- .../browser/webExtensionsScannerService.ts | 24 +- .../common/extensionManagement.ts | 12 +- .../common/webExtensionManagementService.ts | 19 +- .../nativeExtensionManagementService.ts | 4 +- .../cachedExtensionScanner.ts | 8 +- .../common/userDataProfileService.ts | 9 - .../electron-browser/workbenchTestServices.ts | 2 +- 29 files changed, 386 insertions(+), 586 deletions(-) create mode 100644 src/vs/code/electron-browser/sharedProcess/contrib/extensions.ts delete mode 100644 src/vs/code/electron-browser/sharedProcess/contrib/extensionsCleaner.ts delete mode 100644 src/vs/platform/extensionManagement/electron-main/defaultExtensionsProfileInit.ts diff --git a/src/vs/code/electron-browser/sharedProcess/contrib/extensions.ts b/src/vs/code/electron-browser/sharedProcess/contrib/extensions.ts new file mode 100644 index 00000000000..2ae46cb355a --- /dev/null +++ b/src/vs/code/electron-browser/sharedProcess/contrib/extensions.ts @@ -0,0 +1,33 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Disposable } from 'vs/base/common/lifecycle'; +import { DEFAULT_PROFILE_EXTENSIONS_MIGRATION_KEY, IExtensionGalleryService, IGlobalExtensionEnablementService } from 'vs/platform/extensionManagement/common/extensionManagement'; +import { ExtensionStorageService, IExtensionStorageService } from 'vs/platform/extensionManagement/common/extensionStorage'; +import { migrateUnsupportedExtensions } from 'vs/platform/extensionManagement/common/unsupportedExtensionsMigration'; +import { INativeServerExtensionManagementService } from 'vs/platform/extensionManagement/node/extensionManagementService'; +import { ILogService } from 'vs/platform/log/common/log'; +import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; + +export class ExtensionsContributions extends Disposable { + constructor( + @INativeServerExtensionManagementService extensionManagementService: INativeServerExtensionManagementService, + @IExtensionGalleryService extensionGalleryService: IExtensionGalleryService, + @IExtensionStorageService extensionStorageService: IExtensionStorageService, + @IGlobalExtensionEnablementService extensionEnablementService: IGlobalExtensionEnablementService, + @IStorageService storageService: IStorageService, + @ILogService logService: ILogService, + ) { + super(); + + extensionManagementService.migrateDefaultProfileExtensions() + .then(() => storageService.store(DEFAULT_PROFILE_EXTENSIONS_MIGRATION_KEY, true, StorageScope.APPLICATION, StorageTarget.MACHINE), error => null); + + extensionManagementService.removeUninstalledExtensions(); + migrateUnsupportedExtensions(extensionManagementService, extensionGalleryService, extensionStorageService, extensionEnablementService, logService); + ExtensionStorageService.removeOutdatedExtensionVersions(extensionManagementService, storageService); + } + +} diff --git a/src/vs/code/electron-browser/sharedProcess/contrib/extensionsCleaner.ts b/src/vs/code/electron-browser/sharedProcess/contrib/extensionsCleaner.ts deleted file mode 100644 index 7da094c5965..00000000000 --- a/src/vs/code/electron-browser/sharedProcess/contrib/extensionsCleaner.ts +++ /dev/null @@ -1,186 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import { Disposable, DisposableStore, MutableDisposable, toDisposable } from 'vs/base/common/lifecycle'; -import { URI } from 'vs/base/common/uri'; -import { IExtensionGalleryService, IExtensionIdentifier, IGlobalExtensionEnablementService, DidUninstallExtensionEvent, InstallExtensionResult, UninstallOptions } from 'vs/platform/extensionManagement/common/extensionManagement'; -import { getIdAndVersion } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; -import { IExtensionsProfileScannerService } from 'vs/platform/extensionManagement/common/extensionsProfileScannerService'; -import { ExtensionStorageService, IExtensionStorageService } from 'vs/platform/extensionManagement/common/extensionStorage'; -import { migrateUnsupportedExtensions } from 'vs/platform/extensionManagement/common/unsupportedExtensionsMigration'; -import { INativeServerExtensionManagementService } from 'vs/platform/extensionManagement/node/extensionManagementService'; -import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { ILogService } from 'vs/platform/log/common/log'; -import { IStorageService } from 'vs/platform/storage/common/storage'; -import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; -import { DidChangeProfilesEvent, IUserDataProfilesService } from 'vs/platform/userDataProfile/common/userDataProfile'; - -const uninstalOptions: UninstallOptions = { versionOnly: true, donotIncludePack: true, donotCheckDependents: true }; - -export class ExtensionsCleaner extends Disposable { - - constructor( - @INativeServerExtensionManagementService extensionManagementService: INativeServerExtensionManagementService, - @IUserDataProfilesService private readonly userDataProfilesService: IUserDataProfilesService, - @IExtensionGalleryService extensionGalleryService: IExtensionGalleryService, - @IExtensionStorageService extensionStorageService: IExtensionStorageService, - @IGlobalExtensionEnablementService extensionEnablementService: IGlobalExtensionEnablementService, - @IInstantiationService instantiationService: IInstantiationService, - @IStorageService storageService: IStorageService, - @ILogService logService: ILogService, - ) { - super(); - - extensionManagementService.removeUninstalledExtensions(this.userDataProfilesService.profiles.length === 1); - migrateUnsupportedExtensions(extensionManagementService, extensionGalleryService, extensionStorageService, extensionEnablementService, logService); - ExtensionStorageService.removeOutdatedExtensionVersions(extensionManagementService, storageService); - this._register(instantiationService.createInstance(ProfileExtensionsCleaner)); - } -} - -class ProfileExtensionsCleaner extends Disposable { - - private profileExtensionsLocations = new Map; - - private readonly profileModeDisposables = this._register(new MutableDisposable()); - - constructor( - @INativeServerExtensionManagementService private readonly extensionManagementService: INativeServerExtensionManagementService, - @IUserDataProfilesService private readonly userDataProfilesService: IUserDataProfilesService, - @IExtensionsProfileScannerService private readonly extensionsProfileScannerService: IExtensionsProfileScannerService, - @IUriIdentityService private readonly uriIdentityService: IUriIdentityService, - @ILogService private readonly logService: ILogService, - ) { - super(); - this.onDidChangeProfiles({ added: this.userDataProfilesService.profiles, removed: [], all: this.userDataProfilesService.profiles }); - } - - private async onDidChangeProfiles({ added, removed, all }: Omit): Promise { - try { - await Promise.all(removed.map(profile => profile.extensionsResource ? this.removeExtensionsFromProfile(profile.extensionsResource) : Promise.resolve())); - } catch (error) { - this.logService.error(error); - } - - if (all.length === 1) { - // Exit profile mode - this.profileModeDisposables.clear(); - // Listen for entering into profile mode - const disposable = this._register(this.userDataProfilesService.onDidChangeProfiles(() => { - disposable.dispose(); - this.onDidChangeProfiles({ added: this.userDataProfilesService.profiles, removed: [], all: this.userDataProfilesService.profiles }); - })); - return; - } - - try { - if (added.length) { - await Promise.all(added.map(profile => profile.extensionsResource ? this.populateExtensionsFromProfile(profile.extensionsResource) : Promise.resolve())); - // Enter profile mode - if (!this.profileModeDisposables.value) { - this.profileModeDisposables.value = new DisposableStore(); - this.profileModeDisposables.value.add(toDisposable(() => this.profileExtensionsLocations.clear())); - this.profileModeDisposables.value.add(this.userDataProfilesService.onDidChangeProfiles(e => this.onDidChangeProfiles(e))); - this.profileModeDisposables.value.add(this.extensionManagementService.onDidInstallExtensions(e => this.onDidInstallExtensions(e))); - this.profileModeDisposables.value.add(this.extensionManagementService.onDidUninstallExtension(e => this.onDidUninstallExtension(e))); - await this.uninstallExtensionsNotInProfiles(); - } - } - } catch (error) { - this.logService.error(error); - } - } - - private async uninstallExtensionsNotInProfiles(): Promise { - const installed = await this.extensionManagementService.getAllUserInstalled(); - const toUninstall = installed.filter(installedExtension => installedExtension.installedTimestamp /* Installed by VS Code */ && !this.profileExtensionsLocations.has(this.getKey(installedExtension.identifier, installedExtension.manifest.version))); - if (toUninstall.length) { - await Promise.all(toUninstall.map(extension => this.extensionManagementService.uninstall(extension, uninstalOptions))); - } - } - - private async onDidInstallExtensions(installedExtensions: readonly InstallExtensionResult[]): Promise { - for (const { local, profileLocation } of installedExtensions) { - if (!local || !profileLocation) { - continue; - } - this.addExtensionWithKey(this.getKey(local.identifier, local.manifest.version), profileLocation); - } - } - - private async onDidUninstallExtension(e: DidUninstallExtensionEvent): Promise { - if (!e.profileLocation || !e.version) { - return; - } - if (this.removeExtensionWithKey(this.getKey(e.identifier, e.version), e.profileLocation)) { - await this.uninstallExtensions([{ identifier: e.identifier, version: e.version }]); - } - } - - private async populateExtensionsFromProfile(extensionsProfileLocation: URI): Promise { - const extensions = await this.extensionsProfileScannerService.scanProfileExtensions(extensionsProfileLocation); - for (const extension of extensions) { - this.addExtensionWithKey(this.getKey(extension.identifier, extension.version), extensionsProfileLocation); - } - } - - private async removeExtensionsFromProfile(removedProfile: URI): Promise { - const extensionsToRemove: { identifier: IExtensionIdentifier; version: string }[] = []; - for (const key of [...this.profileExtensionsLocations.keys()]) { - if (!this.removeExtensionWithKey(key, removedProfile)) { - continue; - } - const extensionToRemove = this.fromKey(key); - if (extensionToRemove) { - extensionsToRemove.push(extensionToRemove); - } - } - if (extensionsToRemove.length) { - await this.uninstallExtensions(extensionsToRemove); - } - } - - private addExtensionWithKey(key: string, extensionsProfileLocation: URI): void { - let locations = this.profileExtensionsLocations.get(key); - if (!locations) { - locations = []; - this.profileExtensionsLocations.set(key, locations); - } - locations.push(extensionsProfileLocation); - } - - private removeExtensionWithKey(key: string, profileLocation: URI): boolean { - const profiles = this.profileExtensionsLocations.get(key); - if (profiles) { - const index = profiles.findIndex(profile => this.uriIdentityService.extUri.isEqual(profile, profileLocation)); - if (index > -1) { - profiles.splice(index, 1); - } - } - if (!profiles?.length) { - this.profileExtensionsLocations.delete(key); - return true; - } - return false; - } - - private async uninstallExtensions(extensionsToRemove: { identifier: IExtensionIdentifier; version: string }[]): Promise { - const installed = await this.extensionManagementService.getAllUserInstalled(); - const toUninstall = installed.filter(installedExtension => installedExtension.installedTimestamp /* Installed by VS Code */ && extensionsToRemove.some(e => this.getKey(installedExtension.identifier, installedExtension.manifest.version) === this.getKey(e.identifier, e.version))); - if (toUninstall.length) { - await Promise.all(toUninstall.map(extension => this.extensionManagementService.uninstall(extension, uninstalOptions))); - } - } - - private getKey(identifier: IExtensionIdentifier, version: string): string { - return `${ExtensionIdentifier.toKey(identifier.id)}@${version}`; - } - - private fromKey(key: string): { identifier: IExtensionIdentifier; version: string } | undefined { - const [id, version] = getIdAndVersion(key); - return version ? { identifier: { id }, version } : undefined; - } -} diff --git a/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts b/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts index f5bd9adc5a7..8c904e25308 100644 --- a/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts +++ b/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts @@ -14,7 +14,6 @@ import { URI } from 'vs/base/common/uri'; import { ProxyChannel, StaticRouter } from 'vs/base/parts/ipc/common/ipc'; import { Server as MessagePortServer } from 'vs/base/parts/ipc/electron-browser/ipc.mp'; import { CodeCacheCleaner } from 'vs/code/electron-browser/sharedProcess/contrib/codeCacheCleaner'; -import { ExtensionsCleaner } from 'vs/code/electron-browser/sharedProcess/contrib/extensionsCleaner'; import { LanguagePackCachedDataCleaner } from 'vs/code/electron-browser/sharedProcess/contrib/languagePackCachedDataCleaner'; import { LocalizationsUpdater } from 'vs/code/electron-browser/sharedProcess/contrib/localizationsUpdater'; import { LogsDataCleaner } from 'vs/code/electron-browser/sharedProcess/contrib/logsDataCleaner'; @@ -113,6 +112,7 @@ import { RemoteTunnelService } from 'vs/platform/remoteTunnel/electron-browser/r import { IRemoteTunnelService } from 'vs/platform/remoteTunnel/common/remoteTunnel'; import { ISharedProcessLifecycleService, SharedProcessLifecycleService } from 'vs/platform/lifecycle/electron-browser/sharedProcessLifecycleService'; import { UserDataSyncResourceProviderService } from 'vs/platform/userDataSync/common/userDataSyncResourceProvider'; +import { ExtensionsContributions } from 'vs/code/electron-browser/sharedProcess/contrib/extensions'; class SharedProcessMain extends Disposable { @@ -186,7 +186,7 @@ class SharedProcessMain extends Disposable { instantiationService.createInstance(UnusedWorkspaceStorageDataCleaner), instantiationService.createInstance(LogsDataCleaner), instantiationService.createInstance(LocalizationsUpdater), - instantiationService.createInstance(ExtensionsCleaner), + instantiationService.createInstance(ExtensionsContributions), instantiationService.createInstance(UserDataProfilesCleaner) )); } diff --git a/src/vs/code/electron-main/app.ts b/src/vs/code/electron-main/app.ts index b8e21690c1e..a9d491c4908 100644 --- a/src/vs/code/electron-main/app.ts +++ b/src/vs/code/electron-main/app.ts @@ -101,7 +101,6 @@ import { CredentialsNativeMainService } from 'vs/platform/credentials/electron-m import { IPolicyService } from 'vs/platform/policy/common/policy'; import { PolicyChannel } from 'vs/platform/policy/common/policyIpc'; import { IUserDataProfilesMainService } from 'vs/platform/userDataProfile/electron-main/userDataProfile'; -import { DefaultExtensionsProfileInitHandler } from 'vs/platform/extensionManagement/electron-main/defaultExtensionsProfileInit'; import { RequestChannel } from 'vs/platform/request/common/requestIpc'; import { IRequestService } from 'vs/platform/request/common/request'; import { ExtensionsProfileScannerService, IExtensionsProfileScannerService } from 'vs/platform/extensionManagement/common/extensionsProfileScannerService'; @@ -558,9 +557,6 @@ export class CodeApplication extends Disposable { // Auth Handler this._register(instantiationService.createInstance(ProxyAuthHandler)); - // Default Extensions Profile Init Handler - this._register(instantiationService.createInstance(DefaultExtensionsProfileInitHandler)); - // Transient profiles handler this._register(instantiationService.createInstance(UserDataTransientProfilesHandler)); } diff --git a/src/vs/code/node/cliProcessMain.ts b/src/vs/code/node/cliProcessMain.ts index 6c65566f766..3cf630f878f 100644 --- a/src/vs/code/node/cliProcessMain.ts +++ b/src/vs/code/node/cliProcessMain.ts @@ -245,7 +245,7 @@ class CliMain extends Disposable { } private async doRun(environmentService: INativeEnvironmentService, fileService: IFileService, userDataProfilesService: IUserDataProfilesService, instantiationService: IInstantiationService): Promise { - const profileLocation = environmentService.args.profile ? userDataProfilesService.profiles.find(p => p.name === environmentService.args.profile)?.extensionsResource : userDataProfilesService.defaultProfile.extensionsResource; + const profileLocation = (environmentService.args.profile ? userDataProfilesService.profiles.find(p => p.name === environmentService.args.profile) ?? userDataProfilesService.defaultProfile : userDataProfilesService.defaultProfile).extensionsResource; // Install Source if (this.argv['install-source']) { diff --git a/src/vs/platform/extensionManagement/common/abstractExtensionManagementService.ts b/src/vs/platform/extensionManagement/common/abstractExtensionManagementService.ts index 52696de6e81..183e4b527c6 100644 --- a/src/vs/platform/extensionManagement/common/abstractExtensionManagementService.ts +++ b/src/vs/platform/extensionManagement/common/abstractExtensionManagementService.ts @@ -24,6 +24,7 @@ import { IProductService } from 'vs/platform/product/common/productService'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IUserDataProfilesService } from 'vs/platform/userDataProfile/common/userDataProfile'; +export type InstallExtensionTaskOptions = InstallOptions & InstallVSIXOptions & { readonly profileLocation: URI }; export interface IInstallExtensionTask { readonly identifier: IExtensionIdentifier; readonly source: IGalleryExtension | URI; @@ -34,6 +35,7 @@ export interface IInstallExtensionTask { cancel(): void; } +export type UninstallExtensionTaskOptions = UninstallOptions & { readonly profileLocation: URI }; export interface IUninstallExtensionTask { readonly extension: ILocalExtension; run(): Promise; @@ -105,22 +107,6 @@ export abstract class AbstractExtensionManagementService extends Disposable impl return this.uninstallExtension(extension, options); } - async reinstallFromGallery(extension: ILocalExtension): Promise { - this.logService.trace('ExtensionManagementService#reinstallFromGallery', extension.identifier.id); - if (!this.galleryService.isEnabled()) { - throw new Error(nls.localize('MarketPlaceDisabled', "Marketplace is not enabled")); - } - - const targetPlatform = await this.getTargetPlatform(); - const [galleryExtension] = await this.galleryService.getExtensions([{ ...extension.identifier, preRelease: extension.preRelease }], { targetPlatform, compatible: true }, CancellationToken.None); - if (!galleryExtension) { - throw new Error(nls.localize('Not a Marketplace extension', "Only Marketplace Extensions can be reinstalled")); - } - - await this.createUninstallExtensionTask(extension, { remove: true, versionOnly: true }).run(); - await this.installFromGallery(galleryExtension); - } - getExtensionsControlManifest(): Promise { const now = new Date().getTime(); @@ -138,7 +124,12 @@ export abstract class AbstractExtensionManagementService extends Disposable impl protected async installExtension(manifest: IExtensionManifest, extension: URI | IGalleryExtension, options: InstallOptions & InstallVSIXOptions): Promise { - const getInstallExtensionTaskKey = (extension: IGalleryExtension) => `${ExtensionKey.create(extension).toString()}${options.profileLocation ? `-${options.profileLocation.toString()}` : ''}`; + const installExtensionTaskOptions: InstallExtensionTaskOptions = { + ...options, + installOnlyNewlyAddedFromExtensionPack: URI.isUri(extension) ? options.installOnlyNewlyAddedFromExtensionPack : true, /* always true for gallery extensions */ + profileLocation: !options.profileLocation || isApplicationScopedExtension(manifest) ? this.userDataProfilesService.defaultProfile.extensionsResource : options.profileLocation + }; + const getInstallExtensionTaskKey = (extension: IGalleryExtension) => `${ExtensionKey.create(extension).toString()}${installExtensionTaskOptions.profileLocation ? `-${installExtensionTaskOptions.profileLocation.toString()}` : ''}`; // only cache gallery extensions tasks if (!URI.isUri(extension)) { @@ -148,28 +139,27 @@ export abstract class AbstractExtensionManagementService extends Disposable impl const { local } = await installingExtension.task.waitUntilTaskIsFinished(); return local; } - options = { ...options, installOnlyNewlyAddedFromExtensionPack: true /* always true for gallery extensions */ }; } const allInstallExtensionTasks: { task: IInstallExtensionTask; manifest: IExtensionManifest }[] = []; const alreadyRequestedInstallations: Promise[] = []; const installResults: (InstallExtensionResult & { local: ILocalExtension })[] = []; - const installExtensionTask = this.createInstallExtensionTask(manifest, extension, options); + const installExtensionTask = this.createInstallExtensionTask(manifest, extension, installExtensionTaskOptions); if (!URI.isUri(extension)) { this.installingExtensions.set(getInstallExtensionTaskKey(extension), { task: installExtensionTask, waitingTasks: [] }); } - this._onInstallExtension.fire({ identifier: installExtensionTask.identifier, source: extension, profileLocation: options.profileLocation }); + this._onInstallExtension.fire({ identifier: installExtensionTask.identifier, source: extension, profileLocation: installExtensionTaskOptions.profileLocation }); this.logService.info('Installing extension:', installExtensionTask.identifier.id); allInstallExtensionTasks.push({ task: installExtensionTask, manifest }); let installExtensionHasDependents: boolean = false; try { - if (options.donotIncludePackAndDependencies) { + if (installExtensionTaskOptions.donotIncludePackAndDependencies) { this.logService.info('Installing the extension without checking dependencies and pack', installExtensionTask.identifier.id); } else { try { - const allDepsAndPackExtensionsToInstall = await this.getAllDepsAndPackExtensions(installExtensionTask.identifier, manifest, !!options.installOnlyNewlyAddedFromExtensionPack, !!options.installPreReleaseVersion, options.profileLocation); - const installed = await this.getInstalled(undefined, options.profileLocation); + const allDepsAndPackExtensionsToInstall = await this.getAllDepsAndPackExtensions(installExtensionTask.identifier, manifest, !!installExtensionTaskOptions.installOnlyNewlyAddedFromExtensionPack, !!installExtensionTaskOptions.installPreReleaseVersion, installExtensionTaskOptions.profileLocation); + const installed = await this.getInstalled(undefined, installExtensionTaskOptions.profileLocation); for (const { gallery, manifest } of allDepsAndPackExtensionsToInstall) { installExtensionHasDependents = installExtensionHasDependents || !!manifest.extensionDependencies?.some(id => areSameExtensions({ id }, installExtensionTask.identifier)); const key = getInstallExtensionTaskKey(gallery); @@ -192,9 +182,9 @@ export abstract class AbstractExtensionManagementService extends Disposable impl })); } } else if (!installed.some(({ identifier }) => areSameExtensions(identifier, gallery.identifier))) { - const task = this.createInstallExtensionTask(manifest, gallery, { ...options, donotIncludePackAndDependencies: true }); + const task = this.createInstallExtensionTask(manifest, gallery, { ...installExtensionTaskOptions, donotIncludePackAndDependencies: true }); this.installingExtensions.set(key, { task, waitingTasks: [installExtensionTask] }); - this._onInstallExtension.fire({ identifier: task.identifier, source: gallery, profileLocation: options.profileLocation }); + this._onInstallExtension.fire({ identifier: task.identifier, source: gallery, profileLocation: installExtensionTaskOptions.profileLocation }); this.logService.info('Installing extension:', task.identifier.id, installExtensionTask.identifier.id); allInstallExtensionTasks.push({ task, manifest }); } @@ -238,7 +228,7 @@ export abstract class AbstractExtensionManagementService extends Disposable impl const startTime = new Date().getTime(); try { const { local } = await task.run(); - await this.joinAllSettled(this.participants.map(participant => participant.postInstall(local, task.source, options, CancellationToken.None))); + await this.joinAllSettled(this.participants.map(participant => participant.postInstall(local, task.source, installExtensionTaskOptions, CancellationToken.None))); if (!URI.isUri(task.source)) { const isUpdate = task.operation === InstallOperation.Update; const durationSinceUpdate = isUpdate ? undefined : (new Date().getTime() - task.source.lastUpdated) / 1000; @@ -255,7 +245,7 @@ export abstract class AbstractExtensionManagementService extends Disposable impl } catch (error) { /* ignore */ } } } - installResults.push({ local, identifier: task.identifier, operation: task.operation, source: task.source, context: options.context, profileLocation: options.profileLocation, applicationScoped: local.isApplicationScoped }); + installResults.push({ local, identifier: task.identifier, operation: task.operation, source: task.source, context: installExtensionTaskOptions.context, profileLocation: installExtensionTaskOptions.profileLocation, applicationScoped: local.isApplicationScoped }); } catch (error) { if (!URI.isUri(task.source)) { reportTelemetry(this.telemetryService, task.operation === InstallOperation.Update ? 'extensionGallery:update' : 'extensionGallery:install', { @@ -287,7 +277,7 @@ export abstract class AbstractExtensionManagementService extends Disposable impl // rollback installed extensions if (installResults.length) { try { - const result = await Promise.allSettled(installResults.map(({ local }) => this.createUninstallExtensionTask(local, { versionOnly: true, profileLocation: options.profileLocation }).run())); + const result = await Promise.allSettled(installResults.map(({ local }) => this.createUninstallExtensionTask(local, { versionOnly: true, profileLocation: installExtensionTaskOptions.profileLocation }).run())); for (let index = 0; index < result.length; index++) { const r = result[index]; const { identifier } = installResults[index]; @@ -303,7 +293,7 @@ export abstract class AbstractExtensionManagementService extends Disposable impl } } - this._onDidInstallExtensions.fire(allInstallExtensionTasks.map(({ task }) => ({ identifier: task.identifier, operation: InstallOperation.Install, source: task.source, context: options.context, profileLocation: options.profileLocation }))); + this._onDidInstallExtensions.fire(allInstallExtensionTasks.map(({ task }) => ({ identifier: task.identifier, operation: InstallOperation.Install, source: task.source, context: installExtensionTaskOptions.context, profileLocation: installExtensionTaskOptions.profileLocation }))); throw error; } finally { for (const [key, { task, waitingTasks }] of this.installingExtensions.entries()) { @@ -475,50 +465,54 @@ export abstract class AbstractExtensionManagementService extends Disposable impl } private async uninstallExtension(extension: ILocalExtension, options: UninstallOptions): Promise { - const getUninstallExtensionTaskKey = (identifier: IExtensionIdentifier) => `${identifier.id.toLowerCase()}${options.versionOnly ? `-${extension.manifest.version}` : ''}${options.profileLocation ? `@${options.profileLocation.toString()}` : ''}`; + const uninstallOptions: UninstallExtensionTaskOptions = { + ...options, + profileLocation: !options.profileLocation || extension.isApplicationScoped ? this.userDataProfilesService.defaultProfile.extensionsResource : options.profileLocation + }; + const getUninstallExtensionTaskKey = (identifier: IExtensionIdentifier) => `${identifier.id.toLowerCase()}${uninstallOptions.versionOnly ? `-${extension.manifest.version}` : ''}${uninstallOptions.profileLocation ? `@${uninstallOptions.profileLocation.toString()}` : ''}`; const uninstallExtensionTask = this.uninstallingExtensions.get(getUninstallExtensionTaskKey(extension.identifier)); if (uninstallExtensionTask) { this.logService.info('Extensions is already requested to uninstall', extension.identifier.id); return uninstallExtensionTask.waitUntilTaskIsFinished(); } - const createUninstallExtensionTask = (extension: ILocalExtension, uninstallOptions: UninstallOptions): IUninstallExtensionTask => { + const createUninstallExtensionTask = (extension: ILocalExtension): IUninstallExtensionTask => { const uninstallExtensionTask = this.createUninstallExtensionTask(extension, uninstallOptions); this.uninstallingExtensions.set(getUninstallExtensionTaskKey(uninstallExtensionTask.extension.identifier), uninstallExtensionTask); - if (options.profileLocation) { - this.logService.info('Uninstalling extension from the profile:', `${extension.identifier.id}@${extension.manifest.version}`, options.profileLocation.toString()); + if (uninstallOptions.profileLocation) { + this.logService.info('Uninstalling extension from the profile:', `${extension.identifier.id}@${extension.manifest.version}`, uninstallOptions.profileLocation.toString()); } else { this.logService.info('Uninstalling extension:', `${extension.identifier.id}@${extension.manifest.version}`); } - this._onUninstallExtension.fire({ identifier: extension.identifier, profileLocation: options.profileLocation, applicationScoped: extension.isApplicationScoped }); + this._onUninstallExtension.fire({ identifier: extension.identifier, profileLocation: uninstallOptions.profileLocation, applicationScoped: extension.isApplicationScoped }); return uninstallExtensionTask; }; const postUninstallExtension = (extension: ILocalExtension, error?: ExtensionManagementError): void => { if (error) { - if (options.profileLocation) { - this.logService.error('Failed to uninstall extension from the profile:', `${extension.identifier.id}@${extension.manifest.version}`, options.profileLocation.toString(), error.message); + if (uninstallOptions.profileLocation) { + this.logService.error('Failed to uninstall extension from the profile:', `${extension.identifier.id}@${extension.manifest.version}`, uninstallOptions.profileLocation.toString(), error.message); } else { this.logService.error('Failed to uninstall extension:', `${extension.identifier.id}@${extension.manifest.version}`, error.message); } } else { - if (options.profileLocation) { - this.logService.info('Successfully uninstalled extension from the profile', `${extension.identifier.id}@${extension.manifest.version}`, options.profileLocation.toString()); + if (uninstallOptions.profileLocation) { + this.logService.info('Successfully uninstalled extension from the profile', `${extension.identifier.id}@${extension.manifest.version}`, uninstallOptions.profileLocation.toString()); } else { this.logService.info('Successfully uninstalled extension:', `${extension.identifier.id}@${extension.manifest.version}`); } } reportTelemetry(this.telemetryService, 'extensionGallery:uninstall', { extensionData: getLocalExtensionTelemetryData(extension), error }); - this._onDidUninstallExtension.fire({ identifier: extension.identifier, version: extension.manifest.version, error: error?.code, profileLocation: options.profileLocation, applicationScoped: extension.isApplicationScoped }); + this._onDidUninstallExtension.fire({ identifier: extension.identifier, version: extension.manifest.version, error: error?.code, profileLocation: uninstallOptions.profileLocation, applicationScoped: extension.isApplicationScoped }); }; const allTasks: IUninstallExtensionTask[] = []; const processedTasks: IUninstallExtensionTask[] = []; try { - allTasks.push(createUninstallExtensionTask(extension, options)); - const installed = await this.getInstalled(ExtensionType.User, options.profileLocation); - if (options.donotIncludePack) { + allTasks.push(createUninstallExtensionTask(extension)); + const installed = await this.getInstalled(ExtensionType.User, uninstallOptions.profileLocation); + if (uninstallOptions.donotIncludePack) { this.logService.info('Uninstalling the extension without including packed extension', `${extension.identifier.id}@${extension.manifest.version}`); } else { const packedExtensions = this.getAllPackExtensionsToUninstall(extension, installed); @@ -526,12 +520,12 @@ export abstract class AbstractExtensionManagementService extends Disposable impl if (this.uninstallingExtensions.has(getUninstallExtensionTaskKey(packedExtension.identifier))) { this.logService.info('Extensions is already requested to uninstall', packedExtension.identifier.id); } else { - allTasks.push(createUninstallExtensionTask(packedExtension, options)); + allTasks.push(createUninstallExtensionTask(packedExtension)); } } } - if (options.donotCheckDependents) { + if (uninstallOptions.donotCheckDependents) { this.logService.info('Uninstalling the extension without checking dependents', `${extension.identifier.id}@${extension.manifest.version}`); } else { this.checkForDependents(allTasks.map(task => task.extension), installed, extension); @@ -541,7 +535,7 @@ export abstract class AbstractExtensionManagementService extends Disposable impl await this.joinAllSettled(allTasks.map(async task => { try { await task.run(); - await this.joinAllSettled(this.participants.map(participant => participant.postUninstall(task.extension, options, CancellationToken.None))); + await this.joinAllSettled(this.participants.map(participant => participant.postUninstall(task.extension, uninstallOptions, CancellationToken.None))); // only report if extension has a mapped gallery extension. UUID identifies the gallery extension. if (task.extension.identifier.uuid) { try { @@ -652,20 +646,6 @@ export abstract class AbstractExtensionManagementService extends Disposable impl } } - private createInstallExtensionTask(manifest: IExtensionManifest, extension: URI | IGalleryExtension, options: InstallOptions & InstallVSIXOptions): IInstallExtensionTask { - if (options.profileLocation && isApplicationScopedExtension(manifest)) { - options = { ...options, profileLocation: this.userDataProfilesService.defaultProfile.extensionsResource }; - } - return this.doCreateInstallExtensionTask(manifest, extension, options); - } - - private createUninstallExtensionTask(extension: ILocalExtension, options: UninstallOptions): IUninstallExtensionTask { - if (options.profileLocation && extension.isApplicationScoped) { - options = { ...options, profileLocation: this.userDataProfilesService.defaultProfile.extensionsResource }; - } - return this.doCreateUninstallExtensionTask(extension, options); - } - abstract getTargetPlatform(): Promise; abstract zip(extension: ILocalExtension): Promise; abstract unzip(zipLocation: URI): Promise; @@ -673,13 +653,14 @@ export abstract class AbstractExtensionManagementService extends Disposable impl abstract install(vsix: URI, options?: InstallVSIXOptions): Promise; abstract getInstalled(type?: ExtensionType, profileLocation?: URI): Promise; abstract download(extension: IGalleryExtension, operation: InstallOperation): Promise; + abstract reinstallFromGallery(extension: ILocalExtension): Promise; abstract getMetadata(extension: ILocalExtension): Promise; abstract updateMetadata(local: ILocalExtension, metadata: IGalleryMetadata): Promise; abstract updateExtensionScope(local: ILocalExtension, isMachineScoped: boolean): Promise; - protected abstract doCreateInstallExtensionTask(manifest: IExtensionManifest, extension: URI | IGalleryExtension, options: InstallOptions & InstallVSIXOptions): IInstallExtensionTask; - protected abstract doCreateUninstallExtensionTask(extension: ILocalExtension, options: UninstallOptions): IUninstallExtensionTask; + protected abstract createInstallExtensionTask(manifest: IExtensionManifest, extension: URI | IGalleryExtension, options: InstallExtensionTaskOptions): IInstallExtensionTask; + protected abstract createUninstallExtensionTask(extension: ILocalExtension, options: UninstallExtensionTaskOptions): IUninstallExtensionTask; } export function joinErrors(errorOrErrors: (Error | string) | (Array)): Error { diff --git a/src/vs/platform/extensionManagement/common/extensionManagement.ts b/src/vs/platform/extensionManagement/common/extensionManagement.ts index ba3a2b083ce..89907b63d3c 100644 --- a/src/vs/platform/extensionManagement/common/extensionManagement.ts +++ b/src/vs/platform/extensionManagement/common/extensionManagement.ts @@ -16,6 +16,7 @@ import { createDecorator } from 'vs/platform/instantiation/common/instantiation' export const EXTENSION_IDENTIFIER_PATTERN = '^([a-z0-9A-Z][a-z0-9-A-Z]*)\\.([a-z0-9A-Z][a-z0-9-A-Z]*)$'; export const EXTENSION_IDENTIFIER_REGEX = new RegExp(EXTENSION_IDENTIFIER_PATTERN); export const WEB_EXTENSION_TAG = '__web_extension'; +export const DEFAULT_PROFILE_EXTENSIONS_MIGRATION_KEY = 'DEFAULT_PROFILE_EXTENSIONS_MIGRATION'; export function TargetPlatformToString(targetPlatform: TargetPlatform) { switch (targetPlatform) { @@ -498,13 +499,11 @@ export interface IExtensionTipsService { getAllWorkspacesTips(): Promise; } - export const ExtensionsLabel = localize('extensions', "Extensions"); export const ExtensionsLocalizedLabel = { value: ExtensionsLabel, original: 'Extensions' }; export const PreferencesLabel = localize('preferences', "Preferences"); export const PreferencesLocalizedLabel = { value: PreferencesLabel, original: 'Preferences' }; - export interface CLIOutput { log(s: string): void; error(s: string): void; diff --git a/src/vs/platform/extensionManagement/common/extensionsProfileScannerService.ts b/src/vs/platform/extensionManagement/common/extensionsProfileScannerService.ts index a182f889b9f..5bcb3ee7cdc 100644 --- a/src/vs/platform/extensionManagement/common/extensionsProfileScannerService.ts +++ b/src/vs/platform/extensionManagement/common/extensionsProfileScannerService.ts @@ -54,7 +54,7 @@ export class ExtensionsProfileScannerService extends Disposable implements IExte return this.withProfileExtensions(profileLocation); } - addExtensionsToProfile(extensions: [IExtension, Metadata][], profileLocation: URI): Promise { + addExtensionsToProfile(extensions: [IExtension, Metadata | undefined][], profileLocation: URI): Promise { return this.withProfileExtensions(profileLocation, profileExtensions => { // Remove the existing extension to avoid duplicates profileExtensions = profileExtensions.filter(e => extensions.some(([extension]) => !areSameExtensions(e.identifier, extension.identifier))); diff --git a/src/vs/platform/extensionManagement/common/extensionsScannerService.ts b/src/vs/platform/extensionManagement/common/extensionsScannerService.ts index 9ecfff2b321..3a49730edd0 100644 --- a/src/vs/platform/extensionManagement/common/extensionsScannerService.ts +++ b/src/vs/platform/extensionManagement/common/extensionsScannerService.ts @@ -190,8 +190,9 @@ export abstract class AbstractExtensionsScannerService extends Disposable implem } async scanUserExtensions(scanOptions: ScanOptions): Promise { - this.logService.trace('Started scanning user extensions'); - const extensionsScannerInput = await this.createExtensionScannerInput(scanOptions.profileLocation ?? this.userExtensionsLocation, !!scanOptions.profileLocation, ExtensionType.User, !scanOptions.includeUninstalled, scanOptions.language); + const location = scanOptions.profileLocation ?? this.userExtensionsLocation; + this.logService.trace('Started scanning user extensions', location); + const extensionsScannerInput = await this.createExtensionScannerInput(location, !!scanOptions.profileLocation, ExtensionType.User, !scanOptions.includeUninstalled, scanOptions.language); const extensionsScanner = scanOptions.useCache && !extensionsScannerInput.devMode && extensionsScannerInput.excludeObsolete ? this.userExtensionsCachedScanner : this.extensionsScanner; let extensions = await extensionsScanner.scanExtensions(extensionsScannerInput); extensions = await this.applyScanOptions(extensions, ExtensionType.User, scanOptions, true); diff --git a/src/vs/platform/extensionManagement/electron-main/defaultExtensionsProfileInit.ts b/src/vs/platform/extensionManagement/electron-main/defaultExtensionsProfileInit.ts deleted file mode 100644 index 12e63157320..00000000000 --- a/src/vs/platform/extensionManagement/electron-main/defaultExtensionsProfileInit.ts +++ /dev/null @@ -1,57 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import { Disposable } from 'vs/base/common/lifecycle'; -import { joinPath } from 'vs/base/common/resources'; -import { URI } from 'vs/base/common/uri'; -import { IExtensionsProfileScannerService } from 'vs/platform/extensionManagement/common/extensionsProfileScannerService'; -import { IExtensionsScannerService } from 'vs/platform/extensionManagement/common/extensionsScannerService'; -import { IFileService } from 'vs/platform/files/common/files'; -import { ILogService } from 'vs/platform/log/common/log'; -import { EXTENSIONS_RESOURCE_NAME } from 'vs/platform/userDataProfile/common/userDataProfile'; -import { IUserDataProfilesMainService } from 'vs/platform/userDataProfile/electron-main/userDataProfile'; - -export class DefaultExtensionsProfileInitHandler extends Disposable { - constructor( - @IUserDataProfilesMainService private readonly userDataProfilesService: IUserDataProfilesMainService, - @IFileService private readonly fileService: IFileService, - @IExtensionsScannerService private readonly extensionsScannerService: IExtensionsScannerService, - @IExtensionsProfileScannerService private readonly extensionsProfileScannerService: IExtensionsProfileScannerService, - @ILogService logService: ILogService, - ) { - super(); - if (userDataProfilesService.isEnabled()) { - this._register(userDataProfilesService.onWillCreateProfile(e => { - if (userDataProfilesService.profiles.length === 1) { - e.join(this.initialize()); - } - })); - this._register(userDataProfilesService.onDidChangeProfiles(e => { - if (userDataProfilesService.profiles.length === 1) { - this.uninitialize(); - } - })); - } else { - this.uninitialize().then(null, e => logService.error(e)); - } - } - - private async initialize(): Promise { - /* Create and populate the default extensions profile resource */ - const extensionsProfileResource = this.getDefaultExtensionsProfileResource(); - try { await this.fileService.del(extensionsProfileResource); } catch (error) { /* ignore */ } - const userExtensions = await this.extensionsScannerService.scanUserExtensions({ includeInvalid: true }); - await this.extensionsProfileScannerService.addExtensionsToProfile(userExtensions.map(e => [e, e.metadata]), extensionsProfileResource); - } - - private async uninitialize(): Promise { - /* Remove the default extensions profile resource */ - try { await this.fileService.del(this.getDefaultExtensionsProfileResource()); } catch (error) { /* ignore */ } - } - - private getDefaultExtensionsProfileResource(): URI { - return this.userDataProfilesService.defaultProfile.extensionsResource ?? joinPath(this.userDataProfilesService.defaultProfile.location, EXTENSIONS_RESOURCE_NAME); - } -} diff --git a/src/vs/platform/extensionManagement/node/extensionManagementService.ts b/src/vs/platform/extensionManagement/node/extensionManagementService.ts index 520c5667aae..34dc946046b 100644 --- a/src/vs/platform/extensionManagement/node/extensionManagementService.ts +++ b/src/vs/platform/extensionManagement/node/extensionManagementService.ts @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { Promises, Queue } from 'vs/base/common/async'; +import { VSBuffer } from 'vs/base/common/buffer'; import { CancellationToken } from 'vs/base/common/cancellation'; import { IStringDictionary } from 'vs/base/common/collections'; import { toErrorMessage } from 'vs/base/common/errorMessage'; @@ -22,10 +23,10 @@ import { extract, ExtractError, IFile, zip } from 'vs/base/node/zip'; import * as nls from 'vs/nls'; import { IDownloadService } from 'vs/platform/download/common/download'; import { INativeEnvironmentService } from 'vs/platform/environment/common/environment'; -import { AbstractExtensionManagementService, AbstractExtensionTask, IInstallExtensionTask, IUninstallExtensionTask, joinErrors } from 'vs/platform/extensionManagement/common/abstractExtensionManagementService'; +import { AbstractExtensionManagementService, AbstractExtensionTask, IInstallExtensionTask, InstallExtensionTaskOptions, IUninstallExtensionTask, joinErrors, UninstallExtensionTaskOptions } from 'vs/platform/extensionManagement/common/abstractExtensionManagementService'; import { ExtensionManagementError, ExtensionManagementErrorCode, IExtensionGalleryService, IExtensionIdentifier, IExtensionManagementService, IGalleryExtension, IGalleryMetadata, ILocalExtension, InstallOperation, - Metadata, InstallOptions, InstallVSIXOptions, UninstallOptions + Metadata, InstallOptions, InstallVSIXOptions } from 'vs/platform/extensionManagement/common/extensionManagement'; import { areSameExtensions, computeTargetPlatform, ExtensionKey, getGalleryExtensionId, groupByExtension } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { IExtensionsProfileScannerService } from 'vs/platform/extensionManagement/common/extensionsProfileScannerService'; @@ -54,7 +55,9 @@ interface InstallableExtension { export const INativeServerExtensionManagementService = refineServiceDecorator(IExtensionManagementService); export interface INativeServerExtensionManagementService extends IExtensionManagementService { readonly _serviceBrand: undefined; - removeUninstalledExtensions(removeOutdated: boolean): Promise; + migrateDefaultProfileExtensions(): Promise; + markAsUninstalled(...extensions: ILocalExtension[]): Promise; + removeUninstalledExtensions(): Promise; getAllUserInstalled(): Promise; } @@ -85,13 +88,13 @@ export class ExtensionManagementService extends AbstractExtensionManagementServi this.extensionsScanner = this._register(instantiationService.createInstance(ExtensionsScanner, extension => extensionLifecycle.postUninstall(extension))); this.manifestCache = this._register(new ExtensionsManifestCache(environmentService, this)); this.extensionsDownloader = this._register(instantiationService.createInstance(ExtensionsDownloader)); - const extensionsWatcher = this._register(new ExtensionsWatcher(this, fileService, environmentService, logService, uriIdentityService)); + const extensionsWatcher = this._register(new ExtensionsWatcher(this, userDataProfilesService, extensionsProfileScannerService, extensionsScannerService, uriIdentityService, fileService, logService)); this._register(extensionsWatcher.onDidChangeExtensionsByAnotherSource(({ added, removed }) => { if (added.length) { - this._onDidInstallExtensions.fire(added.map(local => ({ identifier: local.identifier, operation: InstallOperation.None, local }))); + this._onDidInstallExtensions.fire(added); } - removed.forEach(extension => this._onDidUninstallExtension.fire({ identifier: extension })); + removed.forEach(e => this._onDidUninstallExtension.fire(e)); })); } @@ -131,7 +134,7 @@ export class ExtensionManagementService extends AbstractExtensionManagementServi } getAllUserInstalled(): Promise { - return this.extensionsScanner.scanUserExtensions(false); + return this.extensionsScanner.scanAllUserExtensions(false); } async install(vsix: URI, options: InstallVSIXOptions = {}): Promise { @@ -173,8 +176,37 @@ export class ExtensionManagementService extends AbstractExtensionManagementServi return local; } - removeUninstalledExtensions(removeOutdated: boolean): Promise { - return this.extensionsScanner.cleanUp(removeOutdated); + async reinstallFromGallery(extension: ILocalExtension): Promise { + this.logService.trace('ExtensionManagementService#reinstallFromGallery', extension.identifier.id); + if (!this.galleryService.isEnabled()) { + throw new Error(nls.localize('MarketPlaceDisabled', "Marketplace is not enabled")); + } + + const targetPlatform = await this.getTargetPlatform(); + const [galleryExtension] = await this.galleryService.getExtensions([{ ...extension.identifier, preRelease: extension.preRelease }], { targetPlatform, compatible: true }, CancellationToken.None); + if (!galleryExtension) { + throw new Error(nls.localize('Not a Marketplace extension', "Only Marketplace Extensions can be reinstalled")); + } + + await this.extensionsScanner.setUninstalled(extension); + try { + await this.extensionsScanner.removeUninstalledExtension(extension); + } catch (e) { + throw new Error(nls.localize('removeError', "Error while removing the extension: {0}. Please Quit and Start VS Code before trying again.", toErrorMessage(e))); + } + await this.installFromGallery(galleryExtension); + } + + markAsUninstalled(...extensions: ILocalExtension[]): Promise { + return this.extensionsScanner.setUninstalled(...extensions); + } + + removeUninstalledExtensions(): Promise { + return this.extensionsScanner.cleanUp(); + } + + migrateDefaultProfileExtensions(): Promise { + return this.extensionsScanner.migrateDefaultProfileExtensions(); } async download(extension: IGalleryExtension, operation: InstallOperation): Promise { @@ -200,7 +232,7 @@ export class ExtensionManagementService extends AbstractExtensionManagementServi return { location, cleanup }; } - protected doCreateInstallExtensionTask(manifest: IExtensionManifest, extension: URI | IGalleryExtension, options: InstallOptions & InstallVSIXOptions): IInstallExtensionTask { + protected createInstallExtensionTask(manifest: IExtensionManifest, extension: URI | IGalleryExtension, options: InstallExtensionTaskOptions): IInstallExtensionTask { let installExtensionTask: IInstallExtensionTask | undefined; if (URI.isUri(extension)) { installExtensionTask = new InstallVSIXTask(manifest, extension, options, this.galleryService, this.extensionsScanner, this.logService); @@ -212,17 +244,11 @@ export class ExtensionManagementService extends AbstractExtensionManagementServi installExtensionTask.waitUntilTaskIsFinished().then(() => this.installGalleryExtensionsTasks.delete(key)); } } - if (options.profileLocation) { - return new InstallExtensionInProfileTask(installExtensionTask, options.profileLocation, this.extensionsProfileScannerService); - } - return installExtensionTask; + return new InstallExtensionInProfileTask(installExtensionTask, options.profileLocation, this.extensionsProfileScannerService); } - protected doCreateUninstallExtensionTask(extension: ILocalExtension, options: UninstallOptions): IUninstallExtensionTask { - if (options.profileLocation) { - return new UninstallExtensionFromProfileTask(extension, options.profileLocation, this.extensionsProfileScannerService); - } - return new UninstallExtensionTask(extension, options, this.extensionsScanner); + protected createUninstallExtensionTask(extension: ILocalExtension, options: UninstallExtensionTaskOptions): IUninstallExtensionTask { + return new UninstallExtensionFromProfileTask(extension, options.profileLocation, this.extensionsProfileScannerService); } private async collectFiles(extension: ILocalExtension): Promise { @@ -261,6 +287,8 @@ export class ExtensionsScanner extends Disposable { private readonly beforeRemovingExtension: (e: ILocalExtension) => Promise, @IFileService private readonly fileService: IFileService, @IExtensionsScannerService private readonly extensionsScannerService: IExtensionsScannerService, + @IUserDataProfilesService private readonly userDataProfilesService: IUserDataProfilesService, + @IExtensionsProfileScannerService private readonly extensionsProfileScannerService: IExtensionsProfileScannerService, @ILogService private readonly logService: ILogService, ) { super(); @@ -268,14 +296,12 @@ export class ExtensionsScanner extends Disposable { this.uninstalledFileLimiter = new Queue(); } - async cleanUp(removeOutdated: boolean): Promise { + async cleanUp(): Promise { await this.removeUninstalledExtensions(); - if (removeOutdated) { - await this.removeOutdatedExtensions(); - } } async scanExtensions(type: ExtensionType | null, profileLocation: URI | undefined): Promise { + await this.migrateDefaultProfileExtensions(); const userScanOptions: ScanOptions = { includeInvalid: true, profileLocation }; let scannedExtensions: IScannedExtension[] = []; if (type === null || type === ExtensionType.System) { @@ -287,12 +313,13 @@ export class ExtensionsScanner extends Disposable { return Promise.all(scannedExtensions.map(extension => this.toLocalExtension(extension))); } - async scanUserExtensions(excludeOutdated: boolean): Promise { + async scanAllUserExtensions(excludeOutdated: boolean): Promise { const scannedExtensions = await this.extensionsScannerService.scanUserExtensions({ includeAllVersions: !excludeOutdated, includeInvalid: true }); return Promise.all(scannedExtensions.map(extension => this.toLocalExtension(extension))); } async extractUserExtension(extensionKey: ExtensionKey, zipPath: string, metadata: Metadata, token: CancellationToken): Promise { + await this.migrateDefaultProfileExtensions(); const folderName = extensionKey.toString(); const tempPath = path.join(this.extensionsScannerService.userExtensionsLocation.fsPath, `.${generateUuid()}`); const extensionPath = path.join(this.extensionsScannerService.userExtensionsLocation.fsPath, folderName); @@ -335,14 +362,16 @@ export class ExtensionsScanner extends Disposable { async setUninstalled(...extensions: ILocalExtension[]): Promise { const extensionKeys: ExtensionKey[] = extensions.map(e => ExtensionKey.create(e)); - await this.withUninstalledExtensions(uninstalled => { - extensionKeys.forEach(extensionKey => uninstalled[extensionKey.toString()] = true); - }); + await this.withUninstalledExtensions(uninstalled => + extensionKeys.forEach(extensionKey => { + uninstalled[extensionKey.toString()] = true; + this.logService.info('Marked extension as uninstalled', extensionKey.toString()); + })); } async setInstalled(extensionKey: ExtensionKey): Promise { await this.withUninstalledExtensions(uninstalled => delete uninstalled[extensionKey.toString()]); - const userExtensions = await this.scanUserExtensions(true); + const userExtensions = await this.scanAllUserExtensions(true); const localExtension = userExtensions.find(i => ExtensionKey.create(i).equals(extensionKey)) || null; if (!localExtension) { return null; @@ -489,35 +518,33 @@ export class ExtensionsScanner extends Disposable { await Promises.settled(toRemove.map(e => this.removeUninstalledExtension(e))); } - private async removeOutdatedExtensions(): Promise { - const systemExtensions = await this.extensionsScannerService.scanSystemExtensions({}); // System extensions - const extensions = await this.extensionsScannerService.scanUserExtensions({ includeAllVersions: true, includeUninstalled: true, includeInvalid: true }); // All user extensions - const toRemove: IScannedExtension[] = []; - - // Outdated extensions - const targetPlatform = await this.extensionsScannerService.getTargetPlatform(); - const byExtension = groupByExtension(extensions, e => e.identifier); - for (const extensions of byExtension) { - if (extensions.length > 1) { - toRemove.push(...extensions.sort((a, b) => { - const vcompare = semver.rcompare(a.manifest.version, b.manifest.version); - if (vcompare !== 0) { - return vcompare; + private _migrateDefaultProfileExtensionsPromise: Promise | undefined = undefined; + migrateDefaultProfileExtensions(): Promise { + if (!this._migrateDefaultProfileExtensionsPromise) { + this._migrateDefaultProfileExtensionsPromise = (async () => { + try { + const migrationMarkerFile = joinPath(this.extensionsScannerService.userExtensionsLocation, '.migrated-default-profile'); + if (await this.fileService.exists(migrationMarkerFile)) { + return; } - if (a.targetPlatform === targetPlatform) { - return -1; + if (!(await this.fileService.exists(this.userDataProfilesService.defaultProfile.extensionsResource))) { + this.logService.info('Started migrating default profile extensions from extensions installation folder to extensions manifest.'); + const userExtensions = await this.extensionsScannerService.scanUserExtensions({ includeInvalid: true }); + await this.extensionsProfileScannerService.addExtensionsToProfile(userExtensions.map(e => [e, e.metadata]), this.userDataProfilesService.defaultProfile.extensionsResource); + this.logService.info('Completed migrating default profile extensions from extensions installation folder to extensions manifest.'); } - return 1; - }).slice(1)); - } - if (extensions[0].type === ExtensionType.System) { - const systemExtension = systemExtensions.find(e => areSameExtensions(e.identifier, extensions[0].identifier)); - if (!systemExtension || semver.gte(systemExtension.manifest.version, extensions[0].manifest.version)) { - toRemove.push(extensions[0]); + try { + await this.fileService.createFile(migrationMarkerFile, VSBuffer.fromString('')); + } catch (error) { + this.logService.warn('Failed to create migration marker file for default profile extensions migration.', getErrorMessage(error)); + } + } catch (error) { + this.logService.error(error); + throw error; } - } + })(); } - await Promises.settled(toRemove.map(extension => this.removeExtension(extension, 'outdated'))); + return this._migrateDefaultProfileExtensionsPromise; } private joinErrors(errorOrErrors: (Error | string) | (Array)): Error { @@ -775,46 +802,6 @@ class InstallExtensionInProfileTask implements IInstallExtensionTask { } } -class UninstallExtensionTask extends AbstractExtensionTask implements IUninstallExtensionTask { - - constructor( - readonly extension: ILocalExtension, - private readonly options: UninstallOptions, - private readonly extensionsScanner: ExtensionsScanner, - ) { - super(); - } - - protected async doRun(token: CancellationToken): Promise { - const toUninstall: ILocalExtension[] = []; - const userExtensions = await this.extensionsScanner.scanUserExtensions(false); - if (this.options.versionOnly) { - const extensionKey = ExtensionKey.create(this.extension); - toUninstall.push(...userExtensions.filter(u => extensionKey.equals(ExtensionKey.create(u)))); - } else { - toUninstall.push(...userExtensions.filter(u => areSameExtensions(u.identifier, this.extension.identifier))); - } - - if (!toUninstall.length) { - throw new Error(nls.localize('notInstalled', "Extension '{0}' is not installed.", this.extension.manifest.displayName || this.extension.manifest.name)); - } - await this.extensionsScanner.setUninstalled(...toUninstall); - - if (this.options.remove) { - for (const extension of toUninstall) { - try { - if (!token.isCancellationRequested) { - await this.extensionsScanner.removeUninstalledExtension(extension); - } - } catch (e) { - throw new Error(nls.localize('removeError', "Error while removing the extension: {0}. Please Quit and Start VS Code before trying again.", toErrorMessage(e))); - } - } - } - } - -} - class UninstallExtensionFromProfileTask extends AbstractExtensionTask implements IUninstallExtensionTask { constructor( diff --git a/src/vs/platform/extensionManagement/node/extensionsWatcher.ts b/src/vs/platform/extensionManagement/node/extensionsWatcher.ts index 2693b4e10bd..e04c1b8b869 100644 --- a/src/vs/platform/extensionManagement/node/extensionsWatcher.ts +++ b/src/vs/platform/extensionManagement/node/extensionsWatcher.ts @@ -6,42 +6,49 @@ import { Emitter, Event } from 'vs/base/common/event'; import { Disposable } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; -import { INativeEnvironmentService } from 'vs/platform/environment/common/environment'; -import { DidUninstallExtensionEvent, IExtensionManagementService, ILocalExtension, InstallExtensionEvent, InstallExtensionResult } from 'vs/platform/extensionManagement/common/extensionManagement'; -import { areSameExtensions } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; -import { IExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; +import { DidUninstallExtensionEvent, InstallExtensionResult, InstallOperation } from 'vs/platform/extensionManagement/common/extensionManagement'; +import { getIdAndVersion } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; +import { IExtensionsProfileScannerService } from 'vs/platform/extensionManagement/common/extensionsProfileScannerService'; +import { IExtensionsScannerService } from 'vs/platform/extensionManagement/common/extensionsScannerService'; +import { INativeServerExtensionManagementService } from 'vs/platform/extensionManagement/node/extensionManagementService'; +import { ExtensionIdentifier, IExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; import { FileChangeType, IFileChange, IFileService } from 'vs/platform/files/common/files'; import { ILogService } from 'vs/platform/log/common/log'; import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; +import { IUserDataProfile, IUserDataProfilesService } from 'vs/platform/userDataProfile/common/userDataProfile'; export class ExtensionsWatcher extends Disposable { - private readonly _onDidChangeExtensionsByAnotherSource = this._register(new Emitter<{ added: ILocalExtension[]; removed: IExtensionIdentifier[] }>()); + private readonly _onDidChangeExtensionsByAnotherSource = this._register(new Emitter<{ added: InstallExtensionResult[]; removed: DidUninstallExtensionEvent[] }>()); readonly onDidChangeExtensionsByAnotherSource = this._onDidChangeExtensionsByAnotherSource.event; - private startTimestamp = 0; - private installingExtensions: IExtensionIdentifier[] = []; - private installedExtensions: IExtensionIdentifier[] | undefined; + private readonly profileExtensionsLocations = new Map; constructor( - private readonly extensionsManagementService: IExtensionManagementService, - @IFileService fileService: IFileService, - @INativeEnvironmentService environmentService: INativeEnvironmentService, - @ILogService private readonly logService: ILogService, - @IUriIdentityService private readonly uriIdentityService: IUriIdentityService, + private readonly extensionManagementService: INativeServerExtensionManagementService, + private readonly userDataProfilesService: IUserDataProfilesService, + private readonly extensionsProfileScannerService: IExtensionsProfileScannerService, + private readonly extensionsScannerService: IExtensionsScannerService, + private readonly uriIdentityService: IUriIdentityService, + private readonly fileService: IFileService, + private readonly logService: ILogService, ) { super(); - this.extensionsManagementService.getInstalled().then(extensions => { - this.installedExtensions = extensions.map(e => e.identifier); - this.startTimestamp = Date.now(); - }); - this._register(extensionsManagementService.onInstallExtension(e => this.onInstallExtension(e))); - this._register(extensionsManagementService.onDidInstallExtensions(e => this.onDidInstallExtensions(e))); - this._register(extensionsManagementService.onDidUninstallExtension(e => this.onDidUninstallExtension(e))); + this.initialize().then(() => this.registerListeners(), error => logService.error(error)); + } - const extensionsResource = URI.file(environmentService.extensionsPath); - this._register(fileService.watch(extensionsResource)); - this._register(Event.filter(fileService.onDidFilesChange, e => e.rawChanges.some(change => this.doesChangeAffects(change, extensionsResource)))(() => this.onDidChange())); + private async initialize(): Promise { + await this.extensionManagementService.migrateDefaultProfileExtensions(); + await this.onDidChangeProfiles(this.userDataProfilesService.profiles, []); + await this.uninstallExtensionsNotInProfiles(); + } + + private registerListeners(): void { + this._register(this.userDataProfilesService.onDidChangeProfiles(e => this.onDidChangeProfiles(e.added, e.removed))); + this._register(this.extensionManagementService.onDidInstallExtensions(e => this.onDidInstallExtensions(e))); + this._register(this.extensionManagementService.onDidUninstallExtension(e => this.onDidUninstallExtension(e))); + this._register(this.fileService.watch(this.extensionsScannerService.userExtensionsLocation)); + this._register(Event.filter(this.fileService.onDidFilesChange, e => e.rawChanges.some(change => this.doesChangeAffects(change, this.extensionsScannerService.userExtensionsLocation)))(() => this.onDidChange())); } private doesChangeAffects(change: IFileChange, extensionsResource: URI): boolean { @@ -68,78 +75,136 @@ export class ExtensionsWatcher extends Disposable { return true; } - private onInstallExtension(e: InstallExtensionEvent): void { - this.addInstallingExtension(e.identifier); - } - - private onDidInstallExtensions(results: readonly InstallExtensionResult[]): void { - for (const e of results) { - this.removeInstallingExtension(e.identifier); - if (e.local) { - this.addInstalledExtension(e.identifier); - } - } - } - - private onDidUninstallExtension(e: DidUninstallExtensionEvent): void { - if (!e.error) { - this.removeInstalledExtension(e.identifier); - } - } - - private addInstallingExtension(extension: IExtensionIdentifier) { - this.removeInstallingExtension(extension); - this.installingExtensions.push(extension); - } - - private removeInstallingExtension(identifier: IExtensionIdentifier) { - this.installingExtensions = this.installingExtensions.filter(e => !areSameExtensions(e, identifier)); - } - - private addInstalledExtension(extension: IExtensionIdentifier): void { - if (this.installedExtensions) { - this.removeInstalledExtension(extension); - this.installedExtensions.push(extension); - } - } - - private removeInstalledExtension(identifier: IExtensionIdentifier): void { - if (this.installedExtensions) { - this.installedExtensions = this.installedExtensions.filter(e => !areSameExtensions(e, identifier)); - } - } - private async onDidChange(): Promise { - if (this.installedExtensions) { - const extensions = await this.extensionsManagementService.getInstalled(); - const added = extensions.filter(e => { - if ([...this.installingExtensions, ...this.installedExtensions!].some(identifier => areSameExtensions(identifier, e.identifier))) { - return false; - } - if (e.installedTimestamp && e.installedTimestamp > this.startTimestamp) { - this.logService.info('Detected extension installed from another source', e.identifier.id); - return true; - } else { - this.logService.info('Ignored extension installed by another source because of invalid timestamp', e.identifier.id); - return false; - } - }); - const removed = this.installedExtensions.filter(identifier => { - // Extension being installed - if (this.installingExtensions.some(installingExtension => areSameExtensions(installingExtension, identifier))) { - return false; - } - if (extensions.every(e => !areSameExtensions(e.identifier, identifier))) { - this.logService.info('Detected extension removed from another source', identifier.id); - return true; - } + const installed = await this.extensionManagementService.getAllUserInstalled(); + const added = installed.filter(e => { + if (e.installedTimestamp !== undefined) { return false; + } + if (this.profileExtensionsLocations.has(this.getKey(e.identifier, e.manifest.version))) { + return false; + } + this.logService.info('Detected extension installed from another source', e.identifier.id); + return true; + }); + if (added.length) { + await this.extensionsProfileScannerService.addExtensionsToProfile(added.map(e => [e, undefined]), this.userDataProfilesService.defaultProfile.extensionsResource); + this._onDidChangeExtensionsByAnotherSource.fire({ + added: added.map(local => ({ + identifier: local.identifier, + operation: InstallOperation.None, + profileLocation: this.userDataProfilesService.defaultProfile.extensionsResource, + local + })), + removed: [] }); - this.installedExtensions = extensions.map(e => e.identifier); - if (added.length || removed.length) { - this._onDidChangeExtensionsByAnotherSource.fire({ added, removed }); + } + } + + private async onDidChangeProfiles(added: readonly IUserDataProfile[], removed: readonly IUserDataProfile[]): Promise { + try { + await Promise.all(removed.map(profile => this.removeExtensionsFromProfile(profile.extensionsResource))); + } catch (error) { + this.logService.error(error); + } + + try { + if (added.length) { + await Promise.all(added.map(profile => this.populateExtensionsFromProfile(profile.extensionsResource))); + } + } catch (error) { + this.logService.error(error); + } + } + + private async uninstallExtensionsNotInProfiles(): Promise { + const installed = await this.extensionManagementService.getAllUserInstalled(); + const toUninstall = installed.filter(installedExtension => !this.profileExtensionsLocations.has(this.getKey(installedExtension.identifier, installedExtension.manifest.version))); + if (toUninstall.length) { + await this.extensionManagementService.markAsUninstalled(...toUninstall); + } + } + + private async onDidInstallExtensions(installedExtensions: readonly InstallExtensionResult[]): Promise { + for (const { local, profileLocation } of installedExtensions) { + if (!local || !profileLocation) { + continue; + } + this.addExtensionWithKey(this.getKey(local.identifier, local.manifest.version), profileLocation); + } + } + + private async onDidUninstallExtension(e: DidUninstallExtensionEvent): Promise { + if (!e.profileLocation || !e.version) { + return; + } + if (this.removeExtensionWithKey(this.getKey(e.identifier, e.version), e.profileLocation)) { + await this.uninstallExtensions([{ identifier: e.identifier, version: e.version }]); + } + } + + private async populateExtensionsFromProfile(extensionsProfileLocation: URI): Promise { + const extensions = await this.extensionsProfileScannerService.scanProfileExtensions(extensionsProfileLocation); + for (const extension of extensions) { + this.addExtensionWithKey(this.getKey(extension.identifier, extension.version), extensionsProfileLocation); + } + } + + private async removeExtensionsFromProfile(removedProfile: URI): Promise { + const extensionsToRemove: { identifier: IExtensionIdentifier; version: string }[] = []; + for (const key of [...this.profileExtensionsLocations.keys()]) { + if (!this.removeExtensionWithKey(key, removedProfile)) { + continue; + } + const extensionToRemove = this.fromKey(key); + if (extensionToRemove) { + extensionsToRemove.push(extensionToRemove); } } + if (extensionsToRemove.length) { + await this.uninstallExtensions(extensionsToRemove); + } + } + + private addExtensionWithKey(key: string, extensionsProfileLocation: URI): void { + let locations = this.profileExtensionsLocations.get(key); + if (!locations) { + locations = []; + this.profileExtensionsLocations.set(key, locations); + } + locations.push(extensionsProfileLocation); + } + + private removeExtensionWithKey(key: string, profileLocation: URI): boolean { + const profiles = this.profileExtensionsLocations.get(key); + if (profiles) { + const index = profiles.findIndex(profile => this.uriIdentityService.extUri.isEqual(profile, profileLocation)); + if (index > -1) { + profiles.splice(index, 1); + } + } + if (!profiles?.length) { + this.profileExtensionsLocations.delete(key); + return true; + } + return false; + } + + private async uninstallExtensions(extensionsToRemove: { identifier: IExtensionIdentifier; version: string }[]): Promise { + const installed = await this.extensionManagementService.getAllUserInstalled(); + const toUninstall = installed.filter(installedExtension => extensionsToRemove.some(e => this.getKey(installedExtension.identifier, installedExtension.manifest.version) === this.getKey(e.identifier, e.version))); + if (toUninstall.length) { + await this.extensionManagementService.markAsUninstalled(...toUninstall); + } + } + + private getKey(identifier: IExtensionIdentifier, version: string): string { + return `${ExtensionIdentifier.toKey(identifier.id)}@${version}`; + } + + private fromKey(key: string): { identifier: IExtensionIdentifier; version: string } | undefined { + const [id, version] = getIdAndVersion(key); + return version ? { identifier: { id }, version } : undefined; } } diff --git a/src/vs/platform/userDataProfile/browser/userDataProfile.ts b/src/vs/platform/userDataProfile/browser/userDataProfile.ts index 8d4253f2c88..a3144510cf6 100644 --- a/src/vs/platform/userDataProfile/browser/userDataProfile.ts +++ b/src/vs/platform/userDataProfile/browser/userDataProfile.ts @@ -16,7 +16,6 @@ type BroadcastedProfileChanges = UriDto>; export class BrowserUserDataProfilesService extends UserDataProfilesService implements IUserDataProfilesService { - protected override readonly defaultProfileShouldIncludeExtensionsResourceAlways: boolean = true; private readonly changesBroadcastChannel: BroadcastDataChannel; constructor( diff --git a/src/vs/platform/userDataProfile/common/userDataProfile.ts b/src/vs/platform/userDataProfile/common/userDataProfile.ts index 2207f1a08e4..b74d2b1cfde 100644 --- a/src/vs/platform/userDataProfile/common/userDataProfile.ts +++ b/src/vs/platform/userDataProfile/common/userDataProfile.ts @@ -7,7 +7,6 @@ import { hash } from 'vs/base/common/hash'; import { Emitter, Event } from 'vs/base/common/event'; import { Disposable } from 'vs/base/common/lifecycle'; import { basename, joinPath } from 'vs/base/common/resources'; -import { isUndefined } from 'vs/base/common/types'; import { URI, UriDto } from 'vs/base/common/uri'; import { localize } from 'vs/nls'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; @@ -45,7 +44,7 @@ export interface IUserDataProfile { readonly keybindingsResource: URI; readonly tasksResource: URI; readonly snippetsHome: URI; - readonly extensionsResource: URI | undefined; + readonly extensionsResource: URI; readonly useDefaultFlags?: UseDefaultProfileFlags; readonly isTransient?: boolean; } @@ -63,7 +62,7 @@ export function isUserDataProfile(thing: unknown): thing is IUserDataProfile { && URI.isUri(candidate.keybindingsResource) && URI.isUri(candidate.tasksResource) && URI.isUri(candidate.snippetsHome) - && (isUndefined(candidate.extensionsResource) || URI.isUri(candidate.extensionsResource)) + && URI.isUri(candidate.extensionsResource) ); } @@ -138,8 +137,6 @@ export function reviveProfile(profile: UriDto, scheme: string) }; } -export const EXTENSIONS_RESOURCE_NAME = 'extensions.json'; - export function toUserDataProfile(id: string, name: string, location: URI, options?: IUserDataProfileOptions): IUserDataProfile { return { id, @@ -152,7 +149,7 @@ export function toUserDataProfile(id: string, name: string, location: URI, optio keybindingsResource: joinPath(location, 'keybindings.json'), tasksResource: joinPath(location, 'tasks.json'), snippetsHome: joinPath(location, 'snippets'), - extensionsResource: joinPath(location, EXTENSIONS_RESOURCE_NAME), + extensionsResource: joinPath(location, 'extensions.json'), useDefaultFlags: options?.useDefaultFlags, isTransient: options?.transient }; @@ -184,7 +181,6 @@ export class UserDataProfilesService extends Disposable implements IUserDataProf readonly _serviceBrand: undefined; protected enabled: boolean = false; - protected readonly defaultProfileShouldIncludeExtensionsResourceAlways: boolean = false; readonly profilesHome: URI; get defaultProfile(): IUserDataProfile { return this.profiles[0]; } @@ -237,7 +233,7 @@ export class UserDataProfilesService extends Disposable implements IUserDataProf let emptyWindow: IUserDataProfile | undefined; const workspaces = new ResourceMap(); const defaultProfile = toUserDataProfile(hash(this.environmentService.userRoamingDataHome.path).toString(16), localize('defaultProfile', "Default"), this.environmentService.userRoamingDataHome); - profiles.unshift({ ...defaultProfile, isDefault: true, extensionsResource: this.defaultProfileShouldIncludeExtensionsResourceAlways || profiles.length > 0 || this.transientProfilesObject.profiles.length > 0 ? defaultProfile.extensionsResource : undefined }); + profiles.unshift({ ...defaultProfile, isDefault: true }); if (profiles.length) { const profileAssicaitions = this.getStoredProfileAssociations(); if (profileAssicaitions.workspaces) { diff --git a/src/vs/platform/userDataProfile/test/common/userDataProfileService.test.ts b/src/vs/platform/userDataProfile/test/common/userDataProfileService.test.ts index 80475cfdc10..e146018fb7c 100644 --- a/src/vs/platform/userDataProfile/test/common/userDataProfileService.test.ts +++ b/src/vs/platform/userDataProfile/test/common/userDataProfileService.test.ts @@ -54,13 +54,12 @@ suite('UserDataProfileService (Common)', () => { assert.strictEqual(testObject.defaultProfile.settingsResource.toString(), joinPath(environmentService.userRoamingDataHome, 'settings.json').toString()); assert.strictEqual(testObject.defaultProfile.snippetsHome.toString(), joinPath(environmentService.userRoamingDataHome, 'snippets').toString()); assert.strictEqual(testObject.defaultProfile.tasksResource.toString(), joinPath(environmentService.userRoamingDataHome, 'tasks.json').toString()); - assert.strictEqual(testObject.defaultProfile.extensionsResource, undefined); + assert.strictEqual(testObject.defaultProfile.extensionsResource.toString(), joinPath(environmentService.userRoamingDataHome, 'extensions.json').toString()); }); test('profiles always include default profile', () => { assert.deepStrictEqual(testObject.profiles.length, 1); assert.deepStrictEqual(testObject.profiles[0].isDefault, true); - assert.deepStrictEqual(testObject.profiles[0].extensionsResource, undefined); }); test('create profile with id', async () => { @@ -116,7 +115,6 @@ suite('UserDataProfileService (Common)', () => { assert.deepStrictEqual(testObject.profiles.length, 2); assert.deepStrictEqual(testObject.profiles[0].isDefault, true); - assert.deepStrictEqual(testObject.profiles[0].extensionsResource?.toString(), joinPath(environmentService.userRoamingDataHome, 'extensions.json').toString()); }); test('profiles include default profile with extension resource undefined when transiet prrofile is removed', async () => { @@ -125,7 +123,6 @@ suite('UserDataProfileService (Common)', () => { assert.deepStrictEqual(testObject.profiles.length, 1); assert.deepStrictEqual(testObject.profiles[0].isDefault, true); - assert.deepStrictEqual(testObject.profiles[0].extensionsResource, undefined); }); test('update named profile', async () => { diff --git a/src/vs/platform/userDataProfile/test/electron-main/userDataProfileMainService.test.ts b/src/vs/platform/userDataProfile/test/electron-main/userDataProfileMainService.test.ts index 7078f0757a4..ddca6884601 100644 --- a/src/vs/platform/userDataProfile/test/electron-main/userDataProfileMainService.test.ts +++ b/src/vs/platform/userDataProfile/test/electron-main/userDataProfileMainService.test.ts @@ -51,26 +51,22 @@ suite('UserDataProfileMainService', () => { test('default profile', () => { assert.strictEqual(testObject.defaultProfile.isDefault, true); - assert.strictEqual(testObject.defaultProfile.extensionsResource, undefined); }); test('profiles always include default profile', () => { assert.deepStrictEqual(testObject.profiles.length, 1); assert.deepStrictEqual(testObject.profiles[0].isDefault, true); - assert.deepStrictEqual(testObject.profiles[0].extensionsResource, undefined); }); test('default profile when there are profiles', async () => { await testObject.createNamedProfile('test'); assert.strictEqual(testObject.defaultProfile.isDefault, true); - assert.strictEqual(testObject.defaultProfile.extensionsResource?.toString(), joinPath(environmentService.userRoamingDataHome, 'extensions.json').toString()); }); test('default profile when profiles are removed', async () => { const profile = await testObject.createNamedProfile('test'); await testObject.removeProfile(profile); assert.strictEqual(testObject.defaultProfile.isDefault, true); - assert.strictEqual(testObject.defaultProfile.extensionsResource, undefined); }); }); diff --git a/src/vs/platform/userDataSync/common/extensionsSync.ts b/src/vs/platform/userDataSync/common/extensionsSync.ts index 87098ee8e71..4e61627c14d 100644 --- a/src/vs/platform/userDataSync/common/extensionsSync.ts +++ b/src/vs/platform/userDataSync/common/extensionsSync.ts @@ -113,7 +113,7 @@ export class ExtensionsSynchroniser extends AbstractSynchroniser implements IUse constructor( // profileLocation changes for default profile - public profile: IUserDataProfile, + profile: IUserDataProfile, collection: string | undefined, @IEnvironmentService environmentService: IEnvironmentService, @IFileService fileService: IFileService, @@ -147,7 +147,7 @@ export class ExtensionsSynchroniser extends AbstractSynchroniser implements IUse const builtinExtensions: IExtensionIdentifier[] = lastSyncUserData?.builtinExtensions || []; const lastSyncExtensions: ISyncExtension[] | null = lastSyncUserData?.syncData ? await parseAndMigrateExtensions(lastSyncUserData.syncData, this.extensionManagementService) : null; - const { localExtensions, ignoredExtensions } = await this.localExtensionsProvider.getLocalExtensions(this.profile); + const { localExtensions, ignoredExtensions } = await this.localExtensionsProvider.getLocalExtensions(this.syncResource.profile); if (remoteExtensions) { this.logService.trace(`${this.syncResourceLogLabel}: Merging remote extensions with local extensions...`); @@ -185,7 +185,7 @@ export class ExtensionsSynchroniser extends AbstractSynchroniser implements IUse protected async hasRemoteChanged(lastSyncUserData: ILastSyncUserData): Promise { const lastSyncExtensions: ISyncExtension[] | null = lastSyncUserData.syncData ? await parseAndMigrateExtensions(lastSyncUserData.syncData, this.extensionManagementService) : null; - const { localExtensions, ignoredExtensions } = await this.localExtensionsProvider.getLocalExtensions(this.profile); + const { localExtensions, ignoredExtensions } = await this.localExtensionsProvider.getLocalExtensions(this.syncResource.profile); const { remote } = merge(localExtensions, lastSyncExtensions, lastSyncExtensions, lastSyncUserData.skippedExtensions || [], ignoredExtensions, lastSyncUserData.builtinExtensions || []); return remote !== null; } @@ -239,7 +239,7 @@ export class ExtensionsSynchroniser extends AbstractSynchroniser implements IUse } private async acceptLocal(resourcePreview: IExtensionResourcePreview): Promise { - const installedExtensions = await this.extensionManagementService.getInstalled(undefined, this.profile.location); + const installedExtensions = await this.extensionManagementService.getInstalled(undefined, this.syncResource.profile.extensionsResource); const ignoredExtensions = this.ignoredExtensionsManagementService.getIgnoredExtensions(installedExtensions); const mergeResult = merge(resourcePreview.localExtensions, null, null, resourcePreview.skippedExtensions, ignoredExtensions, resourcePreview.builtinExtensions); const { local, remote } = mergeResult; @@ -253,7 +253,7 @@ export class ExtensionsSynchroniser extends AbstractSynchroniser implements IUse } private async acceptRemote(resourcePreview: IExtensionResourcePreview): Promise { - const installedExtensions = await this.extensionManagementService.getInstalled(undefined, this.profile.location); + const installedExtensions = await this.extensionManagementService.getInstalled(undefined, this.syncResource.profile.extensionsResource); const ignoredExtensions = this.ignoredExtensionsManagementService.getIgnoredExtensions(installedExtensions); const remoteExtensions = resourcePreview.remoteContent ? JSON.parse(resourcePreview.remoteContent) : null; if (remoteExtensions !== null) { @@ -287,7 +287,7 @@ export class ExtensionsSynchroniser extends AbstractSynchroniser implements IUse if (localChange !== Change.None) { await this.backupLocal(JSON.stringify(localExtensions)); - skippedExtensions = await this.localExtensionsProvider.updateLocalExtensions(local.added, local.removed, local.updated, skippedExtensions, this.profile); + skippedExtensions = await this.localExtensionsProvider.updateLocalExtensions(local.added, local.removed, local.updated, skippedExtensions, this.syncResource.profile); } if (remote) { @@ -325,7 +325,7 @@ export class ExtensionsSynchroniser extends AbstractSynchroniser implements IUse async hasLocalData(): Promise { try { - const { localExtensions } = await this.localExtensionsProvider.getLocalExtensions(this.profile); + const { localExtensions } = await this.localExtensionsProvider.getLocalExtensions(this.syncResource.profile); if (localExtensions.some(e => e.installed || e.disabled)) { return true; } diff --git a/src/vs/platform/userDataSync/common/userDataProfilesManifestSync.ts b/src/vs/platform/userDataSync/common/userDataProfilesManifestSync.ts index 4d3767d988d..8be70621bfd 100644 --- a/src/vs/platform/userDataSync/common/userDataProfilesManifestSync.ts +++ b/src/vs/platform/userDataSync/common/userDataProfilesManifestSync.ts @@ -180,15 +180,27 @@ export class UserDataProfilesManifestSynchroniser extends AbstractSynchroniser i await this.backupLocal(stringifyLocalProfiles(this.getLocalUserDataProfiles(), false)); const promises: Promise[] = []; for (const profile of local.added) { - promises.push(this.userDataProfilesService.createProfile(profile.id, profile.name, { shortName: profile.shortName })); + promises.push((async () => { + this.logService.trace(`${this.syncResourceLogLabel}: Creating '${profile.name}' profile...`); + await this.userDataProfilesService.createProfile(profile.id, profile.name, { shortName: profile.shortName }); + this.logService.info(`${this.syncResourceLogLabel}: Created profile '${profile.name}'.`); + })()); } for (const profile of local.removed) { - promises.push(this.userDataProfilesService.removeProfile(profile)); + promises.push((async () => { + this.logService.trace(`${this.syncResourceLogLabel}: Removing '${profile.name}' profile...`); + await this.userDataProfilesService.removeProfile(profile); + this.logService.info(`${this.syncResourceLogLabel}: Removed profile '${profile.name}'.`); + })()); } for (const profile of local.updated) { const localProfile = this.userDataProfilesService.profiles.find(p => p.id === profile.id); if (localProfile) { - promises.push(this.userDataProfilesService.updateProfile(localProfile, { name: profile.name, shortName: profile.shortName })); + promises.push((async () => { + this.logService.trace(`${this.syncResourceLogLabel}: Updating '${profile.name}' profile...`); + await this.userDataProfilesService.updateProfile(localProfile, { name: profile.name, shortName: profile.shortName }); + this.logService.info(`${this.syncResourceLogLabel}: Updated profile '${profile.name}'.`); + })()); } else { this.logService.info(`${this.syncResourceLogLabel}: Could not find profile with id '${profile.id}' to update.`); } diff --git a/src/vs/platform/userDataSync/common/userDataSyncService.ts b/src/vs/platform/userDataSync/common/userDataSyncService.ts index ab5261c5cc3..2741e974dd2 100644 --- a/src/vs/platform/userDataSync/common/userDataSyncService.ts +++ b/src/vs/platform/userDataSync/common/userDataSyncService.ts @@ -542,19 +542,6 @@ class ProfileSynchronizer extends Disposable { @IEnvironmentService private readonly environmentService: IEnvironmentService, ) { super(); - if (this._profile.isDefault) { - this._register(userDataProfilesService.onDidChangeProfiles(() => { - if ((userDataProfilesService.defaultProfile.extensionsResource && !this._profile.extensionsResource) || - (!userDataProfilesService.defaultProfile.extensionsResource && this._profile.extensionsResource)) { - this._profile = userDataProfilesService.defaultProfile; - for (const [synchronizer] of this._enabled) { - if (synchronizer instanceof ExtensionsSynchroniser) { - synchronizer.profile = this._profile; - } - } - } - })); - } this._register(userDataSyncEnablementService.onDidChangeResourceEnablement(([syncResource, enablement]) => this.onDidChangeResourceEnablement(syncResource, enablement))); this._register(toDisposable(() => this._enabled.splice(0, this._enabled.length).forEach(([, , disposable]) => disposable.dispose()))); for (const syncResource of ALL_SYNC_RESOURCES) { diff --git a/src/vs/server/node/remoteAgentEnvironmentImpl.ts b/src/vs/server/node/remoteAgentEnvironmentImpl.ts index 7f581f36ea5..f16217b0125 100644 --- a/src/vs/server/node/remoteAgentEnvironmentImpl.ts +++ b/src/vs/server/node/remoteAgentEnvironmentImpl.ts @@ -29,6 +29,7 @@ import { IExtensionsScannerService, toExtensionDescription } from 'vs/platform/e import { dedupExtensions } from 'vs/workbench/services/extensions/common/extensionsUtil'; import { IUserDataProfilesService } from 'vs/platform/userDataProfile/common/userDataProfile'; import { ExtensionManagementCLI } from 'vs/platform/extensionManagement/common/extensionManagementCLI'; +import { INativeServerExtensionManagementService } from 'vs/platform/extensionManagement/node/extensionManagementService'; export class RemoteAgentEnvironmentChannel implements IServerChannel { @@ -44,6 +45,7 @@ export class RemoteAgentEnvironmentChannel implements IServerChannel { private readonly _logService: ILogService, private readonly _extensionHostStatusService: IExtensionHostStatusService, private readonly _extensionsScannerService: IExtensionsScannerService, + private readonly _extensionManagementService: INativeServerExtensionManagementService, ) { if (_environmentService.args['install-builtin-extension']) { const installOptions: InstallOptions = { isMachineScoped: !!_environmentService.args['do-not-sync'], installPreReleaseVersion: !!_environmentService.args['pre-release'] }; @@ -334,6 +336,7 @@ export class RemoteAgentEnvironmentChannel implements IServerChannel { } private async _scanInstalledExtensions(language: string): Promise { + await this._extensionManagementService.migrateDefaultProfileExtensions(); const scannedExtensions = await this._extensionsScannerService.scanUserExtensions({ language, useCache: true }); return scannedExtensions.map(e => toExtensionDescription(e, false)); } diff --git a/src/vs/server/node/serverServices.ts b/src/vs/server/node/serverServices.ts index 6978f8f6e4f..9d94002e098 100644 --- a/src/vs/server/node/serverServices.ts +++ b/src/vs/server/node/serverServices.ts @@ -196,7 +196,7 @@ export async function setupServerServices(connectionToken: ServerConnectionToken instantiationService.invokeFunction(accessor => { const extensionManagementService = accessor.get(INativeServerExtensionManagementService); const extensionsScannerService = accessor.get(IExtensionsScannerService); - const remoteExtensionEnvironmentChannel = new RemoteAgentEnvironmentChannel(connectionToken, environmentService, userDataProfilesService, instantiationService.createInstance(ExtensionManagementCLI), logService, extensionHostStatusService, extensionsScannerService); + const remoteExtensionEnvironmentChannel = new RemoteAgentEnvironmentChannel(connectionToken, environmentService, userDataProfilesService, instantiationService.createInstance(ExtensionManagementCLI), logService, extensionHostStatusService, extensionsScannerService, extensionManagementService); socketServer.registerChannel('remoteextensionsenvironment', remoteExtensionEnvironmentChannel); const telemetryChannel = new ServerTelemetryChannel(accessor.get(IServerTelemetryService), oneDsAppender); @@ -219,7 +219,7 @@ export async function setupServerServices(connectionToken: ServerConnectionToken socketServer.registerChannel('credentials', credentialsChannel); // clean up deprecated extensions - extensionManagementService.removeUninstalledExtensions(true); + extensionManagementService.removeUninstalledExtensions(); disposables.add(new ErrorTelemetry(accessor.get(ITelemetryService))); diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts b/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts index 3569cdb1657..7c0e6f44ab8 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts @@ -2501,6 +2501,7 @@ export class ReinstallAction extends Action { constructor( id: string = ReinstallAction.ID, label: string = ReinstallAction.LABEL, @IExtensionsWorkbenchService private readonly extensionsWorkbenchService: IExtensionsWorkbenchService, + @IExtensionManagementServerService private readonly extensionManagementServerService: IExtensionManagementServerService, @IQuickInputService private readonly quickInputService: IQuickInputService, @INotificationService private readonly notificationService: INotificationService, @IHostService private readonly hostService: IHostService, @@ -2523,7 +2524,7 @@ export class ReinstallAction extends Action { return this.extensionsWorkbenchService.queryLocal() .then(local => { const entries = local - .filter(extension => !extension.isBuiltin) + .filter(extension => !extension.isBuiltin && extension.server !== this.extensionManagementServerService.webExtensionManagementServer) .map(extension => { return { id: extension.identifier.id, diff --git a/src/vs/workbench/services/extensionManagement/browser/webExtensionsScannerService.ts b/src/vs/workbench/services/extensionManagement/browser/webExtensionsScannerService.ts index 905f49db4de..abf7fbbcd96 100644 --- a/src/vs/workbench/services/extensionManagement/browser/webExtensionsScannerService.ts +++ b/src/vs/workbench/services/extensionManagement/browser/webExtensionsScannerService.ts @@ -371,7 +371,7 @@ export class WebExtensionsScannerService extends Disposable implements IWebExten return this.readSystemExtensions(); } - async scanUserExtensions(profileLocation?: URI, scanOptions?: ScanOptions): Promise { + async scanUserExtensions(profileLocation: URI, scanOptions?: ScanOptions): Promise { const extensions = new Map(); // Custom builtin extensions defined through `additionalBuiltinExtensions` API @@ -410,7 +410,7 @@ export class WebExtensionsScannerService extends Disposable implements IWebExten return result; } - async scanExistingExtension(extensionLocation: URI, extensionType: ExtensionType, profileLocation?: URI): Promise { + async scanExistingExtension(extensionLocation: URI, extensionType: ExtensionType, profileLocation: URI): Promise { if (extensionType === ExtensionType.System) { const systemExtensions = await this.scanSystemExtensions(); return systemExtensions.find(e => e.location.toString() === extensionLocation.toString()) || null; @@ -419,7 +419,7 @@ export class WebExtensionsScannerService extends Disposable implements IWebExten return userExtensions.find(e => e.location.toString() === extensionLocation.toString()) || null; } - async scanMetadata(extensionLocation: URI, profileLocation?: URI): Promise { + async scanMetadata(extensionLocation: URI, profileLocation: URI): Promise { const extension = await this.scanExistingExtension(extensionLocation, ExtensionType.User, profileLocation); return extension?.metadata; } @@ -437,19 +437,19 @@ export class WebExtensionsScannerService extends Disposable implements IWebExten return null; } - async addExtensionFromGallery(galleryExtension: IGalleryExtension, metadata: Metadata, profileLocation?: URI): Promise { + async addExtensionFromGallery(galleryExtension: IGalleryExtension, metadata: Metadata, profileLocation: URI): Promise { const webExtension = await this.toWebExtensionFromGallery(galleryExtension, metadata); return this.addWebExtension(webExtension, profileLocation); } - async addExtension(location: URI, metadata: Metadata, profileLocation?: URI): Promise { + async addExtension(location: URI, metadata: Metadata, profileLocation: URI): Promise { const webExtension = await this.toWebExtension(location, undefined, undefined, undefined, undefined, undefined, undefined, metadata); const extension = await this.toScannedExtension(webExtension, false); await this.addToInstalledExtensions([webExtension], profileLocation); return extension; } - async removeExtension(extension: IScannedExtension, profileLocation?: URI): Promise { + async removeExtension(extension: IScannedExtension, profileLocation: URI): Promise { await this.writeInstalledExtensions(profileLocation, installedExtensions => installedExtensions.filter(installedExtension => !areSameExtensions(installedExtension.identifier, extension.identifier))); } @@ -467,7 +467,7 @@ export class WebExtensionsScannerService extends Disposable implements IWebExten } } - private async addWebExtension(webExtension: IWebExtension, profileLocation?: URI): Promise { + private async addWebExtension(webExtension: IWebExtension, profileLocation: URI): Promise { const isSystem = !!(await this.scanSystemExtensions()).find(e => areSameExtensions(e.identifier, webExtension.identifier)); const isBuiltin = !!webExtension.metadata?.isBuiltin; const extension = await this.toScannedExtension(webExtension, isBuiltin); @@ -504,7 +504,7 @@ export class WebExtensionsScannerService extends Disposable implements IWebExten return extension; } - private async addToInstalledExtensions(webExtensions: IWebExtension[], profileLocation?: URI): Promise { + private async addToInstalledExtensions(webExtensions: IWebExtension[], profileLocation: URI): Promise { await this.writeInstalledExtensions(profileLocation, installedExtensions => { // Remove the existing extension to avoid duplicates installedExtensions = installedExtensions.filter(installedExtension => webExtensions.some(extension => !areSameExtensions(installedExtension.identifier, extension.identifier))); @@ -513,11 +513,11 @@ export class WebExtensionsScannerService extends Disposable implements IWebExten }); } - private async scanInstalledExtensions(profileLocation?: URI, scanOptions?: ScanOptions): Promise { + private async scanInstalledExtensions(profileLocation: URI, scanOptions?: ScanOptions): Promise { let installedExtensions = await this.readInstalledExtensions(profileLocation); // If current profile is not a default profile, then add the application extensions to the list - if (this.userDataProfilesService.defaultProfile.extensionsResource && !this.uriIdentityService.extUri.isEqual(profileLocation, this.userDataProfilesService.defaultProfile.extensionsResource)) { + if (!this.uriIdentityService.extUri.isEqual(profileLocation, this.userDataProfilesService.defaultProfile.extensionsResource)) { // Remove application extensions from the non default profile installedExtensions = installedExtensions.filter(i => !i.metadata?.isApplicationScoped); // Add application extensions from the default profile to the list @@ -764,14 +764,14 @@ export class WebExtensionsScannerService extends Disposable implements IWebExten return this._migratePackageNLSUrisPromise; } - private async readInstalledExtensions(profileLocation?: URI): Promise { + private async readInstalledExtensions(profileLocation: URI): Promise { if (this.uriIdentityService.extUri.isEqual(profileLocation, this.userDataProfilesService.defaultProfile.extensionsResource)) { await this.migratePackageNLSUris(); } return this.withWebExtensions(profileLocation); } - private writeInstalledExtensions(profileLocation: URI | undefined, updateFn: (extensions: IWebExtension[]) => IWebExtension[]): Promise { + private writeInstalledExtensions(profileLocation: URI, updateFn: (extensions: IWebExtension[]) => IWebExtension[]): Promise { return this.withWebExtensions(profileLocation, updateFn); } diff --git a/src/vs/workbench/services/extensionManagement/common/extensionManagement.ts b/src/vs/workbench/services/extensionManagement/common/extensionManagement.ts index 34d4367b525..aecd0f677db 100644 --- a/src/vs/workbench/services/extensionManagement/common/extensionManagement.ts +++ b/src/vs/workbench/services/extensionManagement/common/extensionManagement.ts @@ -167,15 +167,15 @@ export interface IWebExtensionsScannerService { readonly _serviceBrand: undefined; scanSystemExtensions(): Promise; - scanUserExtensions(profileLocation: URI | undefined, options?: ScanOptions): Promise; + scanUserExtensions(profileLocation: URI, options?: ScanOptions): Promise; scanExtensionsUnderDevelopment(): Promise; - scanExistingExtension(extensionLocation: URI, extensionType: ExtensionType, profileLocation: URI | undefined): Promise; + scanExistingExtension(extensionLocation: URI, extensionType: ExtensionType, profileLocation: URI): Promise; - addExtension(location: URI, metadata: Metadata, profileLocation: URI | undefined): Promise; - addExtensionFromGallery(galleryExtension: IGalleryExtension, metadata: Metadata, profileLocation: URI | undefined): Promise; - removeExtension(extension: IScannedExtension, profileLocation: URI | undefined): Promise; + addExtension(location: URI, metadata: Metadata, profileLocation: URI): Promise; + addExtensionFromGallery(galleryExtension: IGalleryExtension, metadata: Metadata, profileLocation: URI): Promise; + removeExtension(extension: IScannedExtension, profileLocation: URI): Promise; copyExtensions(fromProfileLocation: URI, toProfileLocation: URI, filter: (extension: IScannedExtension) => boolean): Promise; - scanMetadata(extensionLocation: URI, profileLocation: URI | undefined): Promise; + scanMetadata(extensionLocation: URI, profileLocation: URI): Promise; scanExtensionManifest(extensionLocation: URI): Promise; } diff --git a/src/vs/workbench/services/extensionManagement/common/webExtensionManagementService.ts b/src/vs/workbench/services/extensionManagement/common/webExtensionManagementService.ts index 79333395143..0deec1d3631 100644 --- a/src/vs/workbench/services/extensionManagement/common/webExtensionManagementService.ts +++ b/src/vs/workbench/services/extensionManagement/common/webExtensionManagementService.ts @@ -4,14 +4,14 @@ *--------------------------------------------------------------------------------------------*/ import { ExtensionIdentifier, ExtensionType, IExtension, IExtensionIdentifier, IExtensionManifest, TargetPlatform } from 'vs/platform/extensions/common/extensions'; -import { ILocalExtension, IGalleryExtension, IGalleryMetadata, InstallOperation, IExtensionGalleryService, Metadata, InstallOptions, UninstallOptions } from 'vs/platform/extensionManagement/common/extensionManagement'; +import { ILocalExtension, IGalleryExtension, IGalleryMetadata, InstallOperation, IExtensionGalleryService, Metadata, InstallOptions } from 'vs/platform/extensionManagement/common/extensionManagement'; import { URI } from 'vs/base/common/uri'; import { Emitter, Event } from 'vs/base/common/event'; import { areSameExtensions, getGalleryExtensionId } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { IProfileAwareExtensionManagementService, IScannedExtension, IWebExtensionsScannerService } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; import { ILogService } from 'vs/platform/log/common/log'; import { CancellationToken } from 'vs/base/common/cancellation'; -import { AbstractExtensionManagementService, AbstractExtensionTask, IInstallExtensionTask, IUninstallExtensionTask } from 'vs/platform/extensionManagement/common/abstractExtensionManagementService'; +import { AbstractExtensionManagementService, AbstractExtensionTask, IInstallExtensionTask, InstallExtensionTaskOptions, IUninstallExtensionTask, UninstallExtensionTaskOptions } from 'vs/platform/extensionManagement/common/abstractExtensionManagementService'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IExtensionManifestPropertiesService } from 'vs/workbench/services/extensions/common/extensionManifestPropertiesService'; import { IProductService } from 'vs/platform/product/common/productService'; @@ -129,17 +129,11 @@ export class WebExtensionManagementService extends AbstractExtensionManagementSe return local; } - protected doCreateInstallExtensionTask(manifest: IExtensionManifest, extension: URI | IGalleryExtension, options: InstallOptions): IInstallExtensionTask { - if (!options.profileLocation) { - options = { ...options, profileLocation: this.userDataProfileService.currentProfile.extensionsResource }; - } + protected createInstallExtensionTask(manifest: IExtensionManifest, extension: URI | IGalleryExtension, options: InstallExtensionTaskOptions): IInstallExtensionTask { return new InstallExtensionTask(manifest, extension, options, this.webExtensionsScannerService); } - protected doCreateUninstallExtensionTask(extension: ILocalExtension, options: UninstallOptions): IUninstallExtensionTask { - if (!options.profileLocation) { - options = { ...options, profileLocation: this.userDataProfileService.currentProfile.extensionsResource }; - } + protected createUninstallExtensionTask(extension: ILocalExtension, options: UninstallExtensionTaskOptions): IUninstallExtensionTask { return new UninstallExtensionTask(extension, options, this.webExtensionsScannerService); } @@ -148,6 +142,7 @@ export class WebExtensionManagementService extends AbstractExtensionManagementSe getManifest(vsix: URI): Promise { throw new Error('unsupported'); } updateExtensionScope(): Promise { throw new Error('unsupported'); } download(): Promise { throw new Error('unsupported'); } + reinstallFromGallery(): Promise { throw new Error('unsupported'); } private async whenProfileChanged(e: DidChangeUserDataProfileEvent): Promise { const previousProfileLocation = e.previous.extensionsResource; @@ -202,7 +197,7 @@ class InstallExtensionTask extends AbstractExtensionTask<{ local: ILocalExtensio constructor( manifest: IExtensionManifest, private readonly extension: URI | IGalleryExtension, - private readonly options: InstallOptions, + private readonly options: InstallExtensionTaskOptions, private readonly webExtensionsScannerService: IWebExtensionsScannerService, ) { super(); @@ -243,7 +238,7 @@ class UninstallExtensionTask extends AbstractExtensionTask implements IUni constructor( readonly extension: ILocalExtension, - private readonly options: UninstallOptions, + private readonly options: UninstallExtensionTaskOptions, private readonly webExtensionsScannerService: IWebExtensionsScannerService, ) { super(); diff --git a/src/vs/workbench/services/extensionManagement/electron-sandbox/nativeExtensionManagementService.ts b/src/vs/workbench/services/extensionManagement/electron-sandbox/nativeExtensionManagementService.ts index da1f95ec42e..6d2bf5f714b 100644 --- a/src/vs/workbench/services/extensionManagement/electron-sandbox/nativeExtensionManagementService.ts +++ b/src/vs/workbench/services/extensionManagement/electron-sandbox/nativeExtensionManagementService.ts @@ -15,7 +15,6 @@ import { delta } from 'vs/base/common/arrays'; import { compare } from 'vs/base/common/strings'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { DidChangeUserDataProfileEvent, IUserDataProfileService } from 'vs/workbench/services/userDataProfile/common/userDataProfile'; -import { EXTENSIONS_RESOURCE_NAME } from 'vs/platform/userDataProfile/common/userDataProfile'; import { joinPath } from 'vs/base/common/resources'; import { IExtensionsProfileScannerService } from 'vs/platform/extensionManagement/common/extensionsProfileScannerService'; import { Schemas } from 'vs/base/common/network'; @@ -106,8 +105,7 @@ export class NativeExtensionManagementService extends ExtensionManagementChannel } private async whenProfileChanged(e: DidChangeUserDataProfileEvent): Promise { - const previousExtensionsResource = e.previous.extensionsResource ?? joinPath(e.previous.location, EXTENSIONS_RESOURCE_NAME); - const oldExtensions = await super.getInstalled(ExtensionType.User, previousExtensionsResource); + const oldExtensions = await super.getInstalled(ExtensionType.User, e.previous.extensionsResource); if (e.preserveData) { const extensions: [ILocalExtension, Metadata | undefined][] = await Promise.all(oldExtensions .filter(e => !e.isApplicationScoped) /* remove application scoped extensions */ diff --git a/src/vs/workbench/services/extensions/electron-sandbox/cachedExtensionScanner.ts b/src/vs/workbench/services/extensions/electron-sandbox/cachedExtensionScanner.ts index dd9be154068..b2a8611aec9 100644 --- a/src/vs/workbench/services/extensions/electron-sandbox/cachedExtensionScanner.ts +++ b/src/vs/workbench/services/extensions/electron-sandbox/cachedExtensionScanner.ts @@ -16,6 +16,9 @@ import { INotificationService } from 'vs/platform/notification/common/notificati import { IHostService } from 'vs/workbench/services/host/browser/host'; import { timeout } from 'vs/base/common/async'; import { IUserDataProfileService } from 'vs/workbench/services/userDataProfile/common/userDataProfile'; +import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; +import { DEFAULT_PROFILE_EXTENSIONS_MIGRATION_KEY } from 'vs/platform/extensionManagement/common/extensionManagement'; +import { IUserDataProfilesService } from 'vs/platform/userDataProfile/common/userDataProfile'; export class CachedExtensionScanner { @@ -28,6 +31,8 @@ export class CachedExtensionScanner { @IHostService private readonly _hostService: IHostService, @IExtensionsScannerService private readonly _extensionsScannerService: IExtensionsScannerService, @IUserDataProfileService private readonly _userDataProfileService: IUserDataProfileService, + @IUserDataProfilesService private readonly _userDataProfilesService: IUserDataProfilesService, + @IStorageService private readonly _storageService: IStorageService, @ILogService private readonly _logService: ILogService, ) { this.scannedExtensions = new Promise((resolve, reject) => { @@ -53,9 +58,10 @@ export class CachedExtensionScanner { private async _scanInstalledExtensions(): Promise { try { const language = platform.language; + const profileLocation = this._userDataProfilesService.profiles.length === 1 && this._userDataProfileService.currentProfile.isDefault && !this._storageService.getBoolean(DEFAULT_PROFILE_EXTENSIONS_MIGRATION_KEY, StorageScope.APPLICATION, false) ? undefined : this._userDataProfileService.currentProfile.extensionsResource; const [scannedSystemExtensions, scannedUserExtensions] = await Promise.all([ this._extensionsScannerService.scanSystemExtensions({ language, useCache: true, checkControlFile: true }), - this._extensionsScannerService.scanUserExtensions({ language, profileLocation: this._userDataProfileService.currentProfile.extensionsResource, useCache: true })]); + this._extensionsScannerService.scanUserExtensions({ language, profileLocation, useCache: true })]); const scannedDevelopedExtensions = await this._extensionsScannerService.scanExtensionsUnderDevelopment({ language }, [...scannedSystemExtensions, ...scannedUserExtensions]); const system = scannedSystemExtensions.map(e => toExtensionDescription(e, false)); const user = scannedUserExtensions.map(e => toExtensionDescription(e, false)); diff --git a/src/vs/workbench/services/userDataProfile/common/userDataProfileService.ts b/src/vs/workbench/services/userDataProfile/common/userDataProfileService.ts index 63b78ba06b7..2f2f2c8a1fc 100644 --- a/src/vs/workbench/services/userDataProfile/common/userDataProfileService.ts +++ b/src/vs/workbench/services/userDataProfile/common/userDataProfileService.ts @@ -34,15 +34,6 @@ export class UserDataProfileService extends Disposable implements IUserDataProfi super(); this._currentProfile = currentProfile; this._register(userDataProfilesService.onDidChangeProfiles(e => { - /** - * If the current profile is default profile, then reset it because, - * In Desktop the extensions resource will be set/unset in the default profile when profiles are changed. - */ - if (this._currentProfile.isDefault) { - this._currentProfile = userDataProfilesService.defaultProfile; - return; - } - const updatedCurrentProfile = e.updated.find(p => this._currentProfile.id === p.id); if (updatedCurrentProfile) { this._currentProfile = updatedCurrentProfile; diff --git a/src/vs/workbench/test/electron-browser/workbenchTestServices.ts b/src/vs/workbench/test/electron-browser/workbenchTestServices.ts index ebec1acd03c..4b09620745a 100644 --- a/src/vs/workbench/test/electron-browser/workbenchTestServices.ts +++ b/src/vs/workbench/test/electron-browser/workbenchTestServices.ts @@ -68,7 +68,7 @@ const NULL_PROFILE = { keybindingsResource: joinPath(URI.file(homeDir), 'keybindings.json'), tasksResource: joinPath(URI.file(homeDir), 'tasks.json'), snippetsHome: joinPath(URI.file(homeDir), 'snippets'), - extensionsResource: undefined + extensionsResource: joinPath(URI.file(homeDir), 'extensions.json') }; export const TestNativeWindowConfiguration: INativeWindowConfiguration = { From 9dd6ae2026d6f699d70046330dd410666d38b818 Mon Sep 17 00:00:00 2001 From: Ian Huff Date: Wed, 2 Nov 2022 15:12:18 -0700 Subject: [PATCH 060/185] Remove ianhu from team github issue notebooks (#165281) * remove ianhu from team github issue notebooks * revert accidental line end change Co-authored-by: Ian Huff --- .vscode/notebooks/my-endgame.github-issues | 2 +- .vscode/notebooks/verification.github-issues | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.vscode/notebooks/my-endgame.github-issues b/.vscode/notebooks/my-endgame.github-issues index 3bfee2f4e4c..82a403218ab 100644 --- a/.vscode/notebooks/my-endgame.github-issues +++ b/.vscode/notebooks/my-endgame.github-issues @@ -157,7 +157,7 @@ { "kind": 2, "language": "github-issues", - "value": "$REPOS $MILESTONE -$MINE is:issue is:closed reason:completed sort:updated-asc label:bug -label:unreleased -label:verified -label:z-author-verified -label:on-testplan -label:*duplicate -label:duplicate -label:invalid -label:*as-designed -label:error-telemetry -label:verification-steps-needed -label:verification-found -author:aeschli -author:alexdima -author:alexr00 -author:AmandaSilver -author:andreamah -author:bamurtaugh -author:bpasero -author:chrisdias -author:chrmarti -author:Chuxel -author:claudiaregio -author:connor4312 -author:dbaeumer -author:deepak1556 -author:devinvalenciano -author:digitarald -author:DonJayamanne -author:egamma -author:fiveisprime -author:gregvanl -author:hediet -author:IanMatthewHuff -author:isidorn -author:joaomoreno -author:joyceerhl -author:jrieken -author:karrtikr -author:kieferrm -author:lramos15 -author:lszomoru -author:meganrogge -author:misolori -author:mjbvz -author:rebornix -author:roblourens -author:rzhao271 -author:sandy081 -author:sbatten -author:stevencl -author:tanhakabir -author:TylerLeonhardt -author:Tyriar -author:weinand -author:amunger" + "value": "$REPOS $MILESTONE -$MINE is:issue is:closed reason:completed sort:updated-asc label:bug -label:unreleased -label:verified -label:z-author-verified -label:on-testplan -label:*duplicate -label:duplicate -label:invalid -label:*as-designed -label:error-telemetry -label:verification-steps-needed -label:verification-found -author:aeschli -author:alexdima -author:alexr00 -author:AmandaSilver -author:andreamah -author:bamurtaugh -author:bpasero -author:chrisdias -author:chrmarti -author:Chuxel -author:claudiaregio -author:connor4312 -author:dbaeumer -author:deepak1556 -author:devinvalenciano -author:digitarald -author:DonJayamanne -author:egamma -author:fiveisprime -author:gregvanl -author:hediet -author:isidorn -author:joaomoreno -author:joyceerhl -author:jrieken -author:karrtikr -author:kieferrm -author:lramos15 -author:lszomoru -author:meganrogge -author:misolori -author:mjbvz -author:rebornix -author:roblourens -author:rzhao271 -author:sandy081 -author:sbatten -author:stevencl -author:tanhakabir -author:TylerLeonhardt -author:Tyriar -author:weinand -author:amunger" }, { "kind": 1, diff --git a/.vscode/notebooks/verification.github-issues b/.vscode/notebooks/verification.github-issues index 5c6354a4e72..cb3b40c3866 100644 --- a/.vscode/notebooks/verification.github-issues +++ b/.vscode/notebooks/verification.github-issues @@ -32,7 +32,7 @@ { "kind": 2, "language": "github-issues", - "value": "$repos $milestone is:closed reason:completed -assignee:@me label:bug -label:verified -label:*duplicate -author:@me -assignee:@me label:bug -label:verified -author:@me -author:aeschli -author:alexdima -author:alexr00 -author:bpasero -author:chrisdias -author:chrmarti -author:connor4312 -author:dbaeumer -author:deepak1556 -author:eamodio -author:egamma -author:gregvanl -author:isidorn -author:JacksonKearl -author:joaomoreno -author:jrieken -author:lramos15 -author:lszomoru -author:meganrogge -author:misolori -author:mjbvz -author:rebornix -author:RMacfarlane -author:roblourens -author:sana-ajani -author:sandy081 -author:sbatten -author:Tyriar -author:weinand -author:rzhao271 -author:kieferrm -author:TylerLeonhardt -author:bamurtaugh -author:hediet -author:joyceerhl -author:rchiodo -author:IanMatthewHuff" + "value": "$repos $milestone is:closed reason:completed -assignee:@me label:bug -label:verified -label:*duplicate -author:@me -assignee:@me label:bug -label:verified -author:@me -author:aeschli -author:alexdima -author:alexr00 -author:bpasero -author:chrisdias -author:chrmarti -author:connor4312 -author:dbaeumer -author:deepak1556 -author:eamodio -author:egamma -author:gregvanl -author:isidorn -author:JacksonKearl -author:joaomoreno -author:jrieken -author:lramos15 -author:lszomoru -author:meganrogge -author:misolori -author:mjbvz -author:rebornix -author:RMacfarlane -author:roblourens -author:sana-ajani -author:sandy081 -author:sbatten -author:Tyriar -author:weinand -author:rzhao271 -author:kieferrm -author:TylerLeonhardt -author:bamurtaugh -author:hediet -author:joyceerhl -author:rchiodo" }, { "kind": 1, From 87bf03770e9431a0e8e277395251ced840f557f8 Mon Sep 17 00:00:00 2001 From: Megan Rogge Date: Wed, 2 Nov 2022 18:25:32 -0400 Subject: [PATCH 061/185] tweak quick pick pin conditional (#165285) tweak conditional --- src/vs/platform/quickinput/browser/quickPickPin.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/vs/platform/quickinput/browser/quickPickPin.ts b/src/vs/platform/quickinput/browser/quickPickPin.ts index 6ae4fd5a94c..158f7e9bec0 100644 --- a/src/vs/platform/quickinput/browser/quickPickPin.ts +++ b/src/vs/platform/quickinput/browser/quickPickPin.ts @@ -30,10 +30,10 @@ export async function showWithPinnedItems(storageService: IStorageService, stora } }); quickPick.onDidChangeValue(async value => { - // If the items are pinnable (top level quick pick), update items such that - // pinned are excluded from the search results - if (quickPick.items.some(i => i.buttons?.some(b => b.iconClass === pinButtonClass))) { - quickPick.items = value ? itemsWithoutPinned : itemsWithPinned; + if (quickPick.items === itemsWithPinned && value) { + quickPick.items = itemsWithoutPinned; + } else if (quickPick.items === itemsWithoutPinned && !value) { + quickPick.items = itemsWithPinned; } }); From 2da60fd58b3632f58c80f74014de9dd4663a2c3d Mon Sep 17 00:00:00 2001 From: David Dossett Date: Wed, 2 Nov 2022 15:43:18 -0700 Subject: [PATCH 062/185] Update quick pick placeholders and/or remove titles (#165267) --- extensions/git/src/commands.ts | 4 ++-- .../json-language-features/client/src/languageStatus.ts | 3 +-- extensions/npm/src/commands.ts | 3 +-- .../contrib/editSessions/browser/editSessions.contribution.ts | 3 +-- .../editSessions/browser/editSessionsStorageService.ts | 3 +-- src/vs/workbench/contrib/remote/browser/remoteIndicator.ts | 1 + .../electron-sandbox/remoteTunnel.contribution.ts | 3 +-- .../contrib/userDataProfile/browser/userDataProfileActions.ts | 4 +++- .../browser/gettingStarted.contribution.ts | 2 +- 9 files changed, 12 insertions(+), 14 deletions(-) diff --git a/extensions/git/src/commands.ts b/extensions/git/src/commands.ts index fae5e724253..6cce8d881fe 100644 --- a/extensions/git/src/commands.ts +++ b/extensions/git/src/commands.ts @@ -2007,8 +2007,8 @@ export class CommandCenter { const quickpick = window.createQuickPick(); quickpick.items = picks; quickpick.placeholder = opts?.detached - ? l10n.t('Select a ref to checkout in detached mode') - : l10n.t('Select a ref to checkout'); + ? l10n.t('Select a branch or tag to checkout in detached mode') + : l10n.t('Select a branch or tag to checkout'); quickpick.show(); diff --git a/extensions/json-language-features/client/src/languageStatus.ts b/extensions/json-language-features/client/src/languageStatus.ts index a200da53d29..48bd563c194 100644 --- a/extensions/json-language-features/client/src/languageStatus.ts +++ b/extensions/json-language-features/client/src/languageStatus.ts @@ -149,8 +149,7 @@ function showSchemaList(input: ShowSchemasInput) { items.push({ label: localize('schema.showdocs', 'Learn more about JSON schema configuration...'), uri: Uri.parse('https://code.visualstudio.com/docs/languages/json#_json-schemas-and-settings') }); const quickPick = window.createQuickPick(); - quickPick.title = localize('schemaPicker.title', 'JSON Schemas used for {0}', input.uri); - // quickPick.placeholder = items.length ? localize('schemaPicker.placeholder', 'Select the schema to open') : undefined; + quickPick.placeholder = items.length ? localize('schemaPicker.placeholder', 'Select the schema to use for {0}', input.uri) : undefined; quickPick.items = items; quickPick.show(); quickPick.onDidAccept(() => { diff --git a/extensions/npm/src/commands.ts b/extensions/npm/src/commands.ts index e2489a7a58a..a0eb72eec79 100644 --- a/extensions/npm/src/commands.ts +++ b/extensions/npm/src/commands.ts @@ -41,8 +41,7 @@ export async function selectAndRunScriptFromFolder(context: vscode.ExtensionCont if (taskList && taskList.length > 0) { const quickPick = vscode.window.createQuickPick(); - quickPick.title = 'Run NPM script in Folder'; - quickPick.placeholder = 'Select an npm script'; + quickPick.placeholder = 'Select an npm script to run in folder'; quickPick.items = taskList; const toDispose: vscode.Disposable[] = []; diff --git a/src/vs/workbench/contrib/editSessions/browser/editSessions.contribution.ts b/src/vs/workbench/contrib/editSessions/browser/editSessions.contribution.ts index 956c721efe9..0792fa24033 100644 --- a/src/vs/workbench/contrib/editSessions/browser/editSessions.contribution.ts +++ b/src/vs/workbench/contrib/editSessions/browser/editSessions.contribution.ts @@ -748,8 +748,7 @@ export class EditSessionsContribution extends Disposable implements IWorkbenchCo const workspaceContext = this.contextService.getWorkbenchState() === WorkbenchState.FOLDER ? this.contextService.getWorkspace().folders[0].name : this.contextService.getWorkspace().folders.map((folder) => folder.name).join(', '); - quickPick.title = localize('continueEditSessionPick.title', "Continue {0} on", `'${workspaceContext}'`); - quickPick.placeholder = localize('continueEditSessionPick.placeholder', 'Choose how you would like to continue working'); + quickPick.placeholder = localize('continueEditSessionPick.title', "Select option to continue {0} on", `'${workspaceContext}'`); quickPick.items = this.createPickItems(); const command = await new Promise((resolve, reject) => { diff --git a/src/vs/workbench/contrib/editSessions/browser/editSessionsStorageService.ts b/src/vs/workbench/contrib/editSessions/browser/editSessionsStorageService.ts index fcdcc89dcce..ecbacefb8a7 100644 --- a/src/vs/workbench/contrib/editSessions/browser/editSessionsStorageService.ts +++ b/src/vs/workbench/contrib/editSessions/browser/editSessionsStorageService.ts @@ -294,9 +294,8 @@ export class EditSessionsWorkbenchService extends Disposable implements IEditSes */ private async getAccountPreference(fromContinueOn: boolean): Promise { const quickpick = this.quickInputService.createQuickPick(); - quickpick.title = localize('account preference', 'Turn on Edit Sessions to bring your working changes with you'); quickpick.ok = false; - quickpick.placeholder = localize('choose account placeholder', "Select an account to sign in"); + quickpick.placeholder = localize('choose account placeholder', "Select an account to turn on Edit Sessions"); quickpick.ignoreFocusOut = true; quickpick.items = await this.createQuickpickItems(fromContinueOn); diff --git a/src/vs/workbench/contrib/remote/browser/remoteIndicator.ts b/src/vs/workbench/contrib/remote/browser/remoteIndicator.ts index 2e110fe2315..7281f2117bb 100644 --- a/src/vs/workbench/contrib/remote/browser/remoteIndicator.ts +++ b/src/vs/workbench/contrib/remote/browser/remoteIndicator.ts @@ -472,6 +472,7 @@ export class RemoteStatusIndicator extends Disposable implements IWorkbenchContr }; const quickPick = this.quickInputService.createQuickPick(); + quickPick.placeholder = nls.localize('remoteActions', "Select an option to open a Remote Window"); quickPick.items = computeItems(); quickPick.sortByLabel = false; quickPick.canSelectMany = false; diff --git a/src/vs/workbench/contrib/remoteTunnel/electron-sandbox/remoteTunnel.contribution.ts b/src/vs/workbench/contrib/remoteTunnel/electron-sandbox/remoteTunnel.contribution.ts index 699299feb5c..1d0ffffb7e4 100644 --- a/src/vs/workbench/contrib/remoteTunnel/electron-sandbox/remoteTunnel.contribution.ts +++ b/src/vs/workbench/contrib/remoteTunnel/electron-sandbox/remoteTunnel.contribution.ts @@ -260,9 +260,8 @@ export class RemoteTunnelWorkbenchContribution extends Disposable implements IWo private async getAccountPreference(): Promise { const quickpick = this.quickInputService.createQuickPick(); - quickpick.title = localize('accountPreference.title', 'Enable remote access by signing up to remote tunnels.'); quickpick.ok = false; - quickpick.placeholder = localize('accountPreference.placeholder', "Select an account to sign in"); + quickpick.placeholder = localize('accountPreference.placeholder', "Sign in to an account to enable remote access"); quickpick.ignoreFocusOut = true; quickpick.items = await this.createQuickpickItems(); diff --git a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfileActions.ts b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfileActions.ts index a8bfcdadac1..183b6571dc2 100644 --- a/src/vs/workbench/contrib/userDataProfile/browser/userDataProfileActions.ts +++ b/src/vs/workbench/contrib/userDataProfile/browser/userDataProfileActions.ts @@ -219,7 +219,7 @@ export class RenameProfileAction extends Action2 { const name = await quickInputService.input({ value: profile.name, - title: localize('edit settings profile', "Rename Settings Profile..."), + title: localize('select settings profile to rename', 'Rename {0}', profile.name), validateInput: async (value: string) => { if (profile!.name !== value && userDataProfilesService.profiles.some(p => p.name === value)) { return localize('profileExists', "Settings Profile with name {0} already exists.", value); @@ -248,6 +248,7 @@ export class RenameProfileAction extends Action2 { profile })), { + title: localize('rename specific settings profile', "Rename Settings Profile..."), placeHolder: localize('pick profile to rename', "Select Settings Profile to Rename"), }); return pick?.profile; @@ -294,6 +295,7 @@ registerAction2(class DeleteProfileAction extends Action2 { profile })), { + title: localize('delete specific settings profile', "Delete Settings Profile..."), placeHolder: localize('pick profile to delete', "Select Settings Profiles to Delete"), canPickMany: true }); diff --git a/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.contribution.ts b/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.contribution.ts index 2c5c3b04784..572d08bc439 100644 --- a/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.contribution.ts +++ b/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.contribution.ts @@ -232,7 +232,7 @@ registerAction2(class extends Action2 { quickPick.canSelectMany = false; quickPick.matchOnDescription = true; quickPick.matchOnDetail = true; - quickPick.title = localize('pickWalkthroughs', "Open Walkthrough..."); + quickPick.placeholder = localize('pickWalkthroughs', 'Select a walkthrough to open'); quickPick.items = this.getQuickPickItems(contextService, gettingStartedService); quickPick.busy = true; quickPick.onDidAccept(() => { From 57d64af6adaf99b743f4556bbf4976ff8bf33f08 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 2 Nov 2022 16:49:36 -0700 Subject: [PATCH 063/185] Use ?. for property access (#165295) --- .../webviewPanel/browser/webviewEditorInputSerializer.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/webviewPanel/browser/webviewEditorInputSerializer.ts b/src/vs/workbench/contrib/webviewPanel/browser/webviewEditorInputSerializer.ts index 5e0aa8c5be8..97890d0cf1c 100644 --- a/src/vs/workbench/contrib/webviewPanel/browser/webviewEditorInputSerializer.ts +++ b/src/vs/workbench/contrib/webviewPanel/browser/webviewEditorInputSerializer.ts @@ -113,8 +113,8 @@ export class WebviewEditorInputSerializer implements IEditorSerializer { providedId: input.providedId, title: input.getName(), options: { ...input.webview.options, ...input.webview.contentOptions }, - extensionLocation: input.extension ? input.extension.location : undefined, - extensionId: input.extension && input.extension.id ? input.extension.id.value : undefined, + extensionLocation: input.extension?.location, + extensionId: input.extension?.id.value, state: input.webview.state, iconPath: input.iconPath ? { light: input.iconPath.light, dark: input.iconPath.dark, } : undefined, group: input.group From 4efa993b133b7b47e0f4144aaed0eda834699016 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 2 Nov 2022 17:10:12 -0700 Subject: [PATCH 064/185] Bump targets for test/automation and test/integration (#165298) Also enables strict mode for test/integration since it only had strict null checks previously --- test/automation/tsconfig.json | 4 ++-- test/integration/browser/tsconfig.json | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/test/automation/tsconfig.json b/test/automation/tsconfig.json index a923ad396f9..e5cfdfc140e 100644 --- a/test/automation/tsconfig.json +++ b/test/automation/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { "module": "commonjs", - "target": "es2017", + "target": "es2020", "strict": true, "noUnusedParameters": false, "noUnusedLocals": true, @@ -9,7 +9,7 @@ "sourceMap": true, "declaration": true, "lib": [ - "es2016", + "es2020", "dom" ] }, diff --git a/test/integration/browser/tsconfig.json b/test/integration/browser/tsconfig.json index 6f0b40e93e5..262769765a6 100644 --- a/test/integration/browser/tsconfig.json +++ b/test/integration/browser/tsconfig.json @@ -4,14 +4,14 @@ "noImplicitAny": false, "removeComments": false, "preserveConstEnums": true, - "target": "es2017", - "strictNullChecks": true, + "target": "es2020", + "strict": true, "noUnusedParameters": false, "noUnusedLocals": true, "outDir": "out", "sourceMap": true, "lib": [ - "es2016", + "es2020", "dom" ] }, From d9ed6d1ef4425d63428251a0182b5b9ae2b0d844 Mon Sep 17 00:00:00 2001 From: Megan Rogge Date: Wed, 2 Nov 2022 20:48:32 -0400 Subject: [PATCH 065/185] Revert "Fix #164690 #164730 (#165279)" (#165302) --- .../sharedProcess/contrib/extensions.ts | 33 --- .../contrib/extensionsCleaner.ts | 186 +++++++++++++ .../sharedProcess/sharedProcessMain.ts | 4 +- src/vs/code/electron-main/app.ts | 4 + src/vs/code/node/cliProcessMain.ts | 2 +- .../abstractExtensionManagementService.ts | 103 +++++--- .../common/extensionManagement.ts | 3 +- .../common/extensionsProfileScannerService.ts | 2 +- .../common/extensionsScannerService.ts | 5 +- .../defaultExtensionsProfileInit.ts | 57 ++++ .../node/extensionManagementService.ts | 173 ++++++------ .../node/extensionsWatcher.ts | 247 +++++++----------- .../browser/userDataProfile.ts | 1 + .../userDataProfile/common/userDataProfile.ts | 12 +- .../common/userDataProfileService.test.ts | 5 +- .../userDataProfileMainService.test.ts | 4 + .../userDataSync/common/extensionsSync.ts | 14 +- .../common/userDataProfilesManifestSync.ts | 18 +- .../common/userDataSyncService.ts | 13 + .../server/node/remoteAgentEnvironmentImpl.ts | 3 - src/vs/server/node/serverServices.ts | 4 +- .../extensions/browser/extensionsActions.ts | 3 +- .../browser/webExtensionsScannerService.ts | 24 +- .../common/extensionManagement.ts | 12 +- .../common/webExtensionManagementService.ts | 19 +- .../nativeExtensionManagementService.ts | 4 +- .../cachedExtensionScanner.ts | 8 +- .../common/userDataProfileService.ts | 9 + .../electron-browser/workbenchTestServices.ts | 2 +- 29 files changed, 587 insertions(+), 387 deletions(-) delete mode 100644 src/vs/code/electron-browser/sharedProcess/contrib/extensions.ts create mode 100644 src/vs/code/electron-browser/sharedProcess/contrib/extensionsCleaner.ts create mode 100644 src/vs/platform/extensionManagement/electron-main/defaultExtensionsProfileInit.ts diff --git a/src/vs/code/electron-browser/sharedProcess/contrib/extensions.ts b/src/vs/code/electron-browser/sharedProcess/contrib/extensions.ts deleted file mode 100644 index 2ae46cb355a..00000000000 --- a/src/vs/code/electron-browser/sharedProcess/contrib/extensions.ts +++ /dev/null @@ -1,33 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import { Disposable } from 'vs/base/common/lifecycle'; -import { DEFAULT_PROFILE_EXTENSIONS_MIGRATION_KEY, IExtensionGalleryService, IGlobalExtensionEnablementService } from 'vs/platform/extensionManagement/common/extensionManagement'; -import { ExtensionStorageService, IExtensionStorageService } from 'vs/platform/extensionManagement/common/extensionStorage'; -import { migrateUnsupportedExtensions } from 'vs/platform/extensionManagement/common/unsupportedExtensionsMigration'; -import { INativeServerExtensionManagementService } from 'vs/platform/extensionManagement/node/extensionManagementService'; -import { ILogService } from 'vs/platform/log/common/log'; -import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; - -export class ExtensionsContributions extends Disposable { - constructor( - @INativeServerExtensionManagementService extensionManagementService: INativeServerExtensionManagementService, - @IExtensionGalleryService extensionGalleryService: IExtensionGalleryService, - @IExtensionStorageService extensionStorageService: IExtensionStorageService, - @IGlobalExtensionEnablementService extensionEnablementService: IGlobalExtensionEnablementService, - @IStorageService storageService: IStorageService, - @ILogService logService: ILogService, - ) { - super(); - - extensionManagementService.migrateDefaultProfileExtensions() - .then(() => storageService.store(DEFAULT_PROFILE_EXTENSIONS_MIGRATION_KEY, true, StorageScope.APPLICATION, StorageTarget.MACHINE), error => null); - - extensionManagementService.removeUninstalledExtensions(); - migrateUnsupportedExtensions(extensionManagementService, extensionGalleryService, extensionStorageService, extensionEnablementService, logService); - ExtensionStorageService.removeOutdatedExtensionVersions(extensionManagementService, storageService); - } - -} diff --git a/src/vs/code/electron-browser/sharedProcess/contrib/extensionsCleaner.ts b/src/vs/code/electron-browser/sharedProcess/contrib/extensionsCleaner.ts new file mode 100644 index 00000000000..7da094c5965 --- /dev/null +++ b/src/vs/code/electron-browser/sharedProcess/contrib/extensionsCleaner.ts @@ -0,0 +1,186 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Disposable, DisposableStore, MutableDisposable, toDisposable } from 'vs/base/common/lifecycle'; +import { URI } from 'vs/base/common/uri'; +import { IExtensionGalleryService, IExtensionIdentifier, IGlobalExtensionEnablementService, DidUninstallExtensionEvent, InstallExtensionResult, UninstallOptions } from 'vs/platform/extensionManagement/common/extensionManagement'; +import { getIdAndVersion } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; +import { IExtensionsProfileScannerService } from 'vs/platform/extensionManagement/common/extensionsProfileScannerService'; +import { ExtensionStorageService, IExtensionStorageService } from 'vs/platform/extensionManagement/common/extensionStorage'; +import { migrateUnsupportedExtensions } from 'vs/platform/extensionManagement/common/unsupportedExtensionsMigration'; +import { INativeServerExtensionManagementService } from 'vs/platform/extensionManagement/node/extensionManagementService'; +import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { ILogService } from 'vs/platform/log/common/log'; +import { IStorageService } from 'vs/platform/storage/common/storage'; +import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; +import { DidChangeProfilesEvent, IUserDataProfilesService } from 'vs/platform/userDataProfile/common/userDataProfile'; + +const uninstalOptions: UninstallOptions = { versionOnly: true, donotIncludePack: true, donotCheckDependents: true }; + +export class ExtensionsCleaner extends Disposable { + + constructor( + @INativeServerExtensionManagementService extensionManagementService: INativeServerExtensionManagementService, + @IUserDataProfilesService private readonly userDataProfilesService: IUserDataProfilesService, + @IExtensionGalleryService extensionGalleryService: IExtensionGalleryService, + @IExtensionStorageService extensionStorageService: IExtensionStorageService, + @IGlobalExtensionEnablementService extensionEnablementService: IGlobalExtensionEnablementService, + @IInstantiationService instantiationService: IInstantiationService, + @IStorageService storageService: IStorageService, + @ILogService logService: ILogService, + ) { + super(); + + extensionManagementService.removeUninstalledExtensions(this.userDataProfilesService.profiles.length === 1); + migrateUnsupportedExtensions(extensionManagementService, extensionGalleryService, extensionStorageService, extensionEnablementService, logService); + ExtensionStorageService.removeOutdatedExtensionVersions(extensionManagementService, storageService); + this._register(instantiationService.createInstance(ProfileExtensionsCleaner)); + } +} + +class ProfileExtensionsCleaner extends Disposable { + + private profileExtensionsLocations = new Map; + + private readonly profileModeDisposables = this._register(new MutableDisposable()); + + constructor( + @INativeServerExtensionManagementService private readonly extensionManagementService: INativeServerExtensionManagementService, + @IUserDataProfilesService private readonly userDataProfilesService: IUserDataProfilesService, + @IExtensionsProfileScannerService private readonly extensionsProfileScannerService: IExtensionsProfileScannerService, + @IUriIdentityService private readonly uriIdentityService: IUriIdentityService, + @ILogService private readonly logService: ILogService, + ) { + super(); + this.onDidChangeProfiles({ added: this.userDataProfilesService.profiles, removed: [], all: this.userDataProfilesService.profiles }); + } + + private async onDidChangeProfiles({ added, removed, all }: Omit): Promise { + try { + await Promise.all(removed.map(profile => profile.extensionsResource ? this.removeExtensionsFromProfile(profile.extensionsResource) : Promise.resolve())); + } catch (error) { + this.logService.error(error); + } + + if (all.length === 1) { + // Exit profile mode + this.profileModeDisposables.clear(); + // Listen for entering into profile mode + const disposable = this._register(this.userDataProfilesService.onDidChangeProfiles(() => { + disposable.dispose(); + this.onDidChangeProfiles({ added: this.userDataProfilesService.profiles, removed: [], all: this.userDataProfilesService.profiles }); + })); + return; + } + + try { + if (added.length) { + await Promise.all(added.map(profile => profile.extensionsResource ? this.populateExtensionsFromProfile(profile.extensionsResource) : Promise.resolve())); + // Enter profile mode + if (!this.profileModeDisposables.value) { + this.profileModeDisposables.value = new DisposableStore(); + this.profileModeDisposables.value.add(toDisposable(() => this.profileExtensionsLocations.clear())); + this.profileModeDisposables.value.add(this.userDataProfilesService.onDidChangeProfiles(e => this.onDidChangeProfiles(e))); + this.profileModeDisposables.value.add(this.extensionManagementService.onDidInstallExtensions(e => this.onDidInstallExtensions(e))); + this.profileModeDisposables.value.add(this.extensionManagementService.onDidUninstallExtension(e => this.onDidUninstallExtension(e))); + await this.uninstallExtensionsNotInProfiles(); + } + } + } catch (error) { + this.logService.error(error); + } + } + + private async uninstallExtensionsNotInProfiles(): Promise { + const installed = await this.extensionManagementService.getAllUserInstalled(); + const toUninstall = installed.filter(installedExtension => installedExtension.installedTimestamp /* Installed by VS Code */ && !this.profileExtensionsLocations.has(this.getKey(installedExtension.identifier, installedExtension.manifest.version))); + if (toUninstall.length) { + await Promise.all(toUninstall.map(extension => this.extensionManagementService.uninstall(extension, uninstalOptions))); + } + } + + private async onDidInstallExtensions(installedExtensions: readonly InstallExtensionResult[]): Promise { + for (const { local, profileLocation } of installedExtensions) { + if (!local || !profileLocation) { + continue; + } + this.addExtensionWithKey(this.getKey(local.identifier, local.manifest.version), profileLocation); + } + } + + private async onDidUninstallExtension(e: DidUninstallExtensionEvent): Promise { + if (!e.profileLocation || !e.version) { + return; + } + if (this.removeExtensionWithKey(this.getKey(e.identifier, e.version), e.profileLocation)) { + await this.uninstallExtensions([{ identifier: e.identifier, version: e.version }]); + } + } + + private async populateExtensionsFromProfile(extensionsProfileLocation: URI): Promise { + const extensions = await this.extensionsProfileScannerService.scanProfileExtensions(extensionsProfileLocation); + for (const extension of extensions) { + this.addExtensionWithKey(this.getKey(extension.identifier, extension.version), extensionsProfileLocation); + } + } + + private async removeExtensionsFromProfile(removedProfile: URI): Promise { + const extensionsToRemove: { identifier: IExtensionIdentifier; version: string }[] = []; + for (const key of [...this.profileExtensionsLocations.keys()]) { + if (!this.removeExtensionWithKey(key, removedProfile)) { + continue; + } + const extensionToRemove = this.fromKey(key); + if (extensionToRemove) { + extensionsToRemove.push(extensionToRemove); + } + } + if (extensionsToRemove.length) { + await this.uninstallExtensions(extensionsToRemove); + } + } + + private addExtensionWithKey(key: string, extensionsProfileLocation: URI): void { + let locations = this.profileExtensionsLocations.get(key); + if (!locations) { + locations = []; + this.profileExtensionsLocations.set(key, locations); + } + locations.push(extensionsProfileLocation); + } + + private removeExtensionWithKey(key: string, profileLocation: URI): boolean { + const profiles = this.profileExtensionsLocations.get(key); + if (profiles) { + const index = profiles.findIndex(profile => this.uriIdentityService.extUri.isEqual(profile, profileLocation)); + if (index > -1) { + profiles.splice(index, 1); + } + } + if (!profiles?.length) { + this.profileExtensionsLocations.delete(key); + return true; + } + return false; + } + + private async uninstallExtensions(extensionsToRemove: { identifier: IExtensionIdentifier; version: string }[]): Promise { + const installed = await this.extensionManagementService.getAllUserInstalled(); + const toUninstall = installed.filter(installedExtension => installedExtension.installedTimestamp /* Installed by VS Code */ && extensionsToRemove.some(e => this.getKey(installedExtension.identifier, installedExtension.manifest.version) === this.getKey(e.identifier, e.version))); + if (toUninstall.length) { + await Promise.all(toUninstall.map(extension => this.extensionManagementService.uninstall(extension, uninstalOptions))); + } + } + + private getKey(identifier: IExtensionIdentifier, version: string): string { + return `${ExtensionIdentifier.toKey(identifier.id)}@${version}`; + } + + private fromKey(key: string): { identifier: IExtensionIdentifier; version: string } | undefined { + const [id, version] = getIdAndVersion(key); + return version ? { identifier: { id }, version } : undefined; + } +} diff --git a/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts b/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts index 8c904e25308..f5bd9adc5a7 100644 --- a/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts +++ b/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts @@ -14,6 +14,7 @@ import { URI } from 'vs/base/common/uri'; import { ProxyChannel, StaticRouter } from 'vs/base/parts/ipc/common/ipc'; import { Server as MessagePortServer } from 'vs/base/parts/ipc/electron-browser/ipc.mp'; import { CodeCacheCleaner } from 'vs/code/electron-browser/sharedProcess/contrib/codeCacheCleaner'; +import { ExtensionsCleaner } from 'vs/code/electron-browser/sharedProcess/contrib/extensionsCleaner'; import { LanguagePackCachedDataCleaner } from 'vs/code/electron-browser/sharedProcess/contrib/languagePackCachedDataCleaner'; import { LocalizationsUpdater } from 'vs/code/electron-browser/sharedProcess/contrib/localizationsUpdater'; import { LogsDataCleaner } from 'vs/code/electron-browser/sharedProcess/contrib/logsDataCleaner'; @@ -112,7 +113,6 @@ import { RemoteTunnelService } from 'vs/platform/remoteTunnel/electron-browser/r import { IRemoteTunnelService } from 'vs/platform/remoteTunnel/common/remoteTunnel'; import { ISharedProcessLifecycleService, SharedProcessLifecycleService } from 'vs/platform/lifecycle/electron-browser/sharedProcessLifecycleService'; import { UserDataSyncResourceProviderService } from 'vs/platform/userDataSync/common/userDataSyncResourceProvider'; -import { ExtensionsContributions } from 'vs/code/electron-browser/sharedProcess/contrib/extensions'; class SharedProcessMain extends Disposable { @@ -186,7 +186,7 @@ class SharedProcessMain extends Disposable { instantiationService.createInstance(UnusedWorkspaceStorageDataCleaner), instantiationService.createInstance(LogsDataCleaner), instantiationService.createInstance(LocalizationsUpdater), - instantiationService.createInstance(ExtensionsContributions), + instantiationService.createInstance(ExtensionsCleaner), instantiationService.createInstance(UserDataProfilesCleaner) )); } diff --git a/src/vs/code/electron-main/app.ts b/src/vs/code/electron-main/app.ts index a9d491c4908..b8e21690c1e 100644 --- a/src/vs/code/electron-main/app.ts +++ b/src/vs/code/electron-main/app.ts @@ -101,6 +101,7 @@ import { CredentialsNativeMainService } from 'vs/platform/credentials/electron-m import { IPolicyService } from 'vs/platform/policy/common/policy'; import { PolicyChannel } from 'vs/platform/policy/common/policyIpc'; import { IUserDataProfilesMainService } from 'vs/platform/userDataProfile/electron-main/userDataProfile'; +import { DefaultExtensionsProfileInitHandler } from 'vs/platform/extensionManagement/electron-main/defaultExtensionsProfileInit'; import { RequestChannel } from 'vs/platform/request/common/requestIpc'; import { IRequestService } from 'vs/platform/request/common/request'; import { ExtensionsProfileScannerService, IExtensionsProfileScannerService } from 'vs/platform/extensionManagement/common/extensionsProfileScannerService'; @@ -557,6 +558,9 @@ export class CodeApplication extends Disposable { // Auth Handler this._register(instantiationService.createInstance(ProxyAuthHandler)); + // Default Extensions Profile Init Handler + this._register(instantiationService.createInstance(DefaultExtensionsProfileInitHandler)); + // Transient profiles handler this._register(instantiationService.createInstance(UserDataTransientProfilesHandler)); } diff --git a/src/vs/code/node/cliProcessMain.ts b/src/vs/code/node/cliProcessMain.ts index 3cf630f878f..6c65566f766 100644 --- a/src/vs/code/node/cliProcessMain.ts +++ b/src/vs/code/node/cliProcessMain.ts @@ -245,7 +245,7 @@ class CliMain extends Disposable { } private async doRun(environmentService: INativeEnvironmentService, fileService: IFileService, userDataProfilesService: IUserDataProfilesService, instantiationService: IInstantiationService): Promise { - const profileLocation = (environmentService.args.profile ? userDataProfilesService.profiles.find(p => p.name === environmentService.args.profile) ?? userDataProfilesService.defaultProfile : userDataProfilesService.defaultProfile).extensionsResource; + const profileLocation = environmentService.args.profile ? userDataProfilesService.profiles.find(p => p.name === environmentService.args.profile)?.extensionsResource : userDataProfilesService.defaultProfile.extensionsResource; // Install Source if (this.argv['install-source']) { diff --git a/src/vs/platform/extensionManagement/common/abstractExtensionManagementService.ts b/src/vs/platform/extensionManagement/common/abstractExtensionManagementService.ts index 183e4b527c6..52696de6e81 100644 --- a/src/vs/platform/extensionManagement/common/abstractExtensionManagementService.ts +++ b/src/vs/platform/extensionManagement/common/abstractExtensionManagementService.ts @@ -24,7 +24,6 @@ import { IProductService } from 'vs/platform/product/common/productService'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IUserDataProfilesService } from 'vs/platform/userDataProfile/common/userDataProfile'; -export type InstallExtensionTaskOptions = InstallOptions & InstallVSIXOptions & { readonly profileLocation: URI }; export interface IInstallExtensionTask { readonly identifier: IExtensionIdentifier; readonly source: IGalleryExtension | URI; @@ -35,7 +34,6 @@ export interface IInstallExtensionTask { cancel(): void; } -export type UninstallExtensionTaskOptions = UninstallOptions & { readonly profileLocation: URI }; export interface IUninstallExtensionTask { readonly extension: ILocalExtension; run(): Promise; @@ -107,6 +105,22 @@ export abstract class AbstractExtensionManagementService extends Disposable impl return this.uninstallExtension(extension, options); } + async reinstallFromGallery(extension: ILocalExtension): Promise { + this.logService.trace('ExtensionManagementService#reinstallFromGallery', extension.identifier.id); + if (!this.galleryService.isEnabled()) { + throw new Error(nls.localize('MarketPlaceDisabled', "Marketplace is not enabled")); + } + + const targetPlatform = await this.getTargetPlatform(); + const [galleryExtension] = await this.galleryService.getExtensions([{ ...extension.identifier, preRelease: extension.preRelease }], { targetPlatform, compatible: true }, CancellationToken.None); + if (!galleryExtension) { + throw new Error(nls.localize('Not a Marketplace extension', "Only Marketplace Extensions can be reinstalled")); + } + + await this.createUninstallExtensionTask(extension, { remove: true, versionOnly: true }).run(); + await this.installFromGallery(galleryExtension); + } + getExtensionsControlManifest(): Promise { const now = new Date().getTime(); @@ -124,12 +138,7 @@ export abstract class AbstractExtensionManagementService extends Disposable impl protected async installExtension(manifest: IExtensionManifest, extension: URI | IGalleryExtension, options: InstallOptions & InstallVSIXOptions): Promise { - const installExtensionTaskOptions: InstallExtensionTaskOptions = { - ...options, - installOnlyNewlyAddedFromExtensionPack: URI.isUri(extension) ? options.installOnlyNewlyAddedFromExtensionPack : true, /* always true for gallery extensions */ - profileLocation: !options.profileLocation || isApplicationScopedExtension(manifest) ? this.userDataProfilesService.defaultProfile.extensionsResource : options.profileLocation - }; - const getInstallExtensionTaskKey = (extension: IGalleryExtension) => `${ExtensionKey.create(extension).toString()}${installExtensionTaskOptions.profileLocation ? `-${installExtensionTaskOptions.profileLocation.toString()}` : ''}`; + const getInstallExtensionTaskKey = (extension: IGalleryExtension) => `${ExtensionKey.create(extension).toString()}${options.profileLocation ? `-${options.profileLocation.toString()}` : ''}`; // only cache gallery extensions tasks if (!URI.isUri(extension)) { @@ -139,27 +148,28 @@ export abstract class AbstractExtensionManagementService extends Disposable impl const { local } = await installingExtension.task.waitUntilTaskIsFinished(); return local; } + options = { ...options, installOnlyNewlyAddedFromExtensionPack: true /* always true for gallery extensions */ }; } const allInstallExtensionTasks: { task: IInstallExtensionTask; manifest: IExtensionManifest }[] = []; const alreadyRequestedInstallations: Promise[] = []; const installResults: (InstallExtensionResult & { local: ILocalExtension })[] = []; - const installExtensionTask = this.createInstallExtensionTask(manifest, extension, installExtensionTaskOptions); + const installExtensionTask = this.createInstallExtensionTask(manifest, extension, options); if (!URI.isUri(extension)) { this.installingExtensions.set(getInstallExtensionTaskKey(extension), { task: installExtensionTask, waitingTasks: [] }); } - this._onInstallExtension.fire({ identifier: installExtensionTask.identifier, source: extension, profileLocation: installExtensionTaskOptions.profileLocation }); + this._onInstallExtension.fire({ identifier: installExtensionTask.identifier, source: extension, profileLocation: options.profileLocation }); this.logService.info('Installing extension:', installExtensionTask.identifier.id); allInstallExtensionTasks.push({ task: installExtensionTask, manifest }); let installExtensionHasDependents: boolean = false; try { - if (installExtensionTaskOptions.donotIncludePackAndDependencies) { + if (options.donotIncludePackAndDependencies) { this.logService.info('Installing the extension without checking dependencies and pack', installExtensionTask.identifier.id); } else { try { - const allDepsAndPackExtensionsToInstall = await this.getAllDepsAndPackExtensions(installExtensionTask.identifier, manifest, !!installExtensionTaskOptions.installOnlyNewlyAddedFromExtensionPack, !!installExtensionTaskOptions.installPreReleaseVersion, installExtensionTaskOptions.profileLocation); - const installed = await this.getInstalled(undefined, installExtensionTaskOptions.profileLocation); + const allDepsAndPackExtensionsToInstall = await this.getAllDepsAndPackExtensions(installExtensionTask.identifier, manifest, !!options.installOnlyNewlyAddedFromExtensionPack, !!options.installPreReleaseVersion, options.profileLocation); + const installed = await this.getInstalled(undefined, options.profileLocation); for (const { gallery, manifest } of allDepsAndPackExtensionsToInstall) { installExtensionHasDependents = installExtensionHasDependents || !!manifest.extensionDependencies?.some(id => areSameExtensions({ id }, installExtensionTask.identifier)); const key = getInstallExtensionTaskKey(gallery); @@ -182,9 +192,9 @@ export abstract class AbstractExtensionManagementService extends Disposable impl })); } } else if (!installed.some(({ identifier }) => areSameExtensions(identifier, gallery.identifier))) { - const task = this.createInstallExtensionTask(manifest, gallery, { ...installExtensionTaskOptions, donotIncludePackAndDependencies: true }); + const task = this.createInstallExtensionTask(manifest, gallery, { ...options, donotIncludePackAndDependencies: true }); this.installingExtensions.set(key, { task, waitingTasks: [installExtensionTask] }); - this._onInstallExtension.fire({ identifier: task.identifier, source: gallery, profileLocation: installExtensionTaskOptions.profileLocation }); + this._onInstallExtension.fire({ identifier: task.identifier, source: gallery, profileLocation: options.profileLocation }); this.logService.info('Installing extension:', task.identifier.id, installExtensionTask.identifier.id); allInstallExtensionTasks.push({ task, manifest }); } @@ -228,7 +238,7 @@ export abstract class AbstractExtensionManagementService extends Disposable impl const startTime = new Date().getTime(); try { const { local } = await task.run(); - await this.joinAllSettled(this.participants.map(participant => participant.postInstall(local, task.source, installExtensionTaskOptions, CancellationToken.None))); + await this.joinAllSettled(this.participants.map(participant => participant.postInstall(local, task.source, options, CancellationToken.None))); if (!URI.isUri(task.source)) { const isUpdate = task.operation === InstallOperation.Update; const durationSinceUpdate = isUpdate ? undefined : (new Date().getTime() - task.source.lastUpdated) / 1000; @@ -245,7 +255,7 @@ export abstract class AbstractExtensionManagementService extends Disposable impl } catch (error) { /* ignore */ } } } - installResults.push({ local, identifier: task.identifier, operation: task.operation, source: task.source, context: installExtensionTaskOptions.context, profileLocation: installExtensionTaskOptions.profileLocation, applicationScoped: local.isApplicationScoped }); + installResults.push({ local, identifier: task.identifier, operation: task.operation, source: task.source, context: options.context, profileLocation: options.profileLocation, applicationScoped: local.isApplicationScoped }); } catch (error) { if (!URI.isUri(task.source)) { reportTelemetry(this.telemetryService, task.operation === InstallOperation.Update ? 'extensionGallery:update' : 'extensionGallery:install', { @@ -277,7 +287,7 @@ export abstract class AbstractExtensionManagementService extends Disposable impl // rollback installed extensions if (installResults.length) { try { - const result = await Promise.allSettled(installResults.map(({ local }) => this.createUninstallExtensionTask(local, { versionOnly: true, profileLocation: installExtensionTaskOptions.profileLocation }).run())); + const result = await Promise.allSettled(installResults.map(({ local }) => this.createUninstallExtensionTask(local, { versionOnly: true, profileLocation: options.profileLocation }).run())); for (let index = 0; index < result.length; index++) { const r = result[index]; const { identifier } = installResults[index]; @@ -293,7 +303,7 @@ export abstract class AbstractExtensionManagementService extends Disposable impl } } - this._onDidInstallExtensions.fire(allInstallExtensionTasks.map(({ task }) => ({ identifier: task.identifier, operation: InstallOperation.Install, source: task.source, context: installExtensionTaskOptions.context, profileLocation: installExtensionTaskOptions.profileLocation }))); + this._onDidInstallExtensions.fire(allInstallExtensionTasks.map(({ task }) => ({ identifier: task.identifier, operation: InstallOperation.Install, source: task.source, context: options.context, profileLocation: options.profileLocation }))); throw error; } finally { for (const [key, { task, waitingTasks }] of this.installingExtensions.entries()) { @@ -465,54 +475,50 @@ export abstract class AbstractExtensionManagementService extends Disposable impl } private async uninstallExtension(extension: ILocalExtension, options: UninstallOptions): Promise { - const uninstallOptions: UninstallExtensionTaskOptions = { - ...options, - profileLocation: !options.profileLocation || extension.isApplicationScoped ? this.userDataProfilesService.defaultProfile.extensionsResource : options.profileLocation - }; - const getUninstallExtensionTaskKey = (identifier: IExtensionIdentifier) => `${identifier.id.toLowerCase()}${uninstallOptions.versionOnly ? `-${extension.manifest.version}` : ''}${uninstallOptions.profileLocation ? `@${uninstallOptions.profileLocation.toString()}` : ''}`; + const getUninstallExtensionTaskKey = (identifier: IExtensionIdentifier) => `${identifier.id.toLowerCase()}${options.versionOnly ? `-${extension.manifest.version}` : ''}${options.profileLocation ? `@${options.profileLocation.toString()}` : ''}`; const uninstallExtensionTask = this.uninstallingExtensions.get(getUninstallExtensionTaskKey(extension.identifier)); if (uninstallExtensionTask) { this.logService.info('Extensions is already requested to uninstall', extension.identifier.id); return uninstallExtensionTask.waitUntilTaskIsFinished(); } - const createUninstallExtensionTask = (extension: ILocalExtension): IUninstallExtensionTask => { + const createUninstallExtensionTask = (extension: ILocalExtension, uninstallOptions: UninstallOptions): IUninstallExtensionTask => { const uninstallExtensionTask = this.createUninstallExtensionTask(extension, uninstallOptions); this.uninstallingExtensions.set(getUninstallExtensionTaskKey(uninstallExtensionTask.extension.identifier), uninstallExtensionTask); - if (uninstallOptions.profileLocation) { - this.logService.info('Uninstalling extension from the profile:', `${extension.identifier.id}@${extension.manifest.version}`, uninstallOptions.profileLocation.toString()); + if (options.profileLocation) { + this.logService.info('Uninstalling extension from the profile:', `${extension.identifier.id}@${extension.manifest.version}`, options.profileLocation.toString()); } else { this.logService.info('Uninstalling extension:', `${extension.identifier.id}@${extension.manifest.version}`); } - this._onUninstallExtension.fire({ identifier: extension.identifier, profileLocation: uninstallOptions.profileLocation, applicationScoped: extension.isApplicationScoped }); + this._onUninstallExtension.fire({ identifier: extension.identifier, profileLocation: options.profileLocation, applicationScoped: extension.isApplicationScoped }); return uninstallExtensionTask; }; const postUninstallExtension = (extension: ILocalExtension, error?: ExtensionManagementError): void => { if (error) { - if (uninstallOptions.profileLocation) { - this.logService.error('Failed to uninstall extension from the profile:', `${extension.identifier.id}@${extension.manifest.version}`, uninstallOptions.profileLocation.toString(), error.message); + if (options.profileLocation) { + this.logService.error('Failed to uninstall extension from the profile:', `${extension.identifier.id}@${extension.manifest.version}`, options.profileLocation.toString(), error.message); } else { this.logService.error('Failed to uninstall extension:', `${extension.identifier.id}@${extension.manifest.version}`, error.message); } } else { - if (uninstallOptions.profileLocation) { - this.logService.info('Successfully uninstalled extension from the profile', `${extension.identifier.id}@${extension.manifest.version}`, uninstallOptions.profileLocation.toString()); + if (options.profileLocation) { + this.logService.info('Successfully uninstalled extension from the profile', `${extension.identifier.id}@${extension.manifest.version}`, options.profileLocation.toString()); } else { this.logService.info('Successfully uninstalled extension:', `${extension.identifier.id}@${extension.manifest.version}`); } } reportTelemetry(this.telemetryService, 'extensionGallery:uninstall', { extensionData: getLocalExtensionTelemetryData(extension), error }); - this._onDidUninstallExtension.fire({ identifier: extension.identifier, version: extension.manifest.version, error: error?.code, profileLocation: uninstallOptions.profileLocation, applicationScoped: extension.isApplicationScoped }); + this._onDidUninstallExtension.fire({ identifier: extension.identifier, version: extension.manifest.version, error: error?.code, profileLocation: options.profileLocation, applicationScoped: extension.isApplicationScoped }); }; const allTasks: IUninstallExtensionTask[] = []; const processedTasks: IUninstallExtensionTask[] = []; try { - allTasks.push(createUninstallExtensionTask(extension)); - const installed = await this.getInstalled(ExtensionType.User, uninstallOptions.profileLocation); - if (uninstallOptions.donotIncludePack) { + allTasks.push(createUninstallExtensionTask(extension, options)); + const installed = await this.getInstalled(ExtensionType.User, options.profileLocation); + if (options.donotIncludePack) { this.logService.info('Uninstalling the extension without including packed extension', `${extension.identifier.id}@${extension.manifest.version}`); } else { const packedExtensions = this.getAllPackExtensionsToUninstall(extension, installed); @@ -520,12 +526,12 @@ export abstract class AbstractExtensionManagementService extends Disposable impl if (this.uninstallingExtensions.has(getUninstallExtensionTaskKey(packedExtension.identifier))) { this.logService.info('Extensions is already requested to uninstall', packedExtension.identifier.id); } else { - allTasks.push(createUninstallExtensionTask(packedExtension)); + allTasks.push(createUninstallExtensionTask(packedExtension, options)); } } } - if (uninstallOptions.donotCheckDependents) { + if (options.donotCheckDependents) { this.logService.info('Uninstalling the extension without checking dependents', `${extension.identifier.id}@${extension.manifest.version}`); } else { this.checkForDependents(allTasks.map(task => task.extension), installed, extension); @@ -535,7 +541,7 @@ export abstract class AbstractExtensionManagementService extends Disposable impl await this.joinAllSettled(allTasks.map(async task => { try { await task.run(); - await this.joinAllSettled(this.participants.map(participant => participant.postUninstall(task.extension, uninstallOptions, CancellationToken.None))); + await this.joinAllSettled(this.participants.map(participant => participant.postUninstall(task.extension, options, CancellationToken.None))); // only report if extension has a mapped gallery extension. UUID identifies the gallery extension. if (task.extension.identifier.uuid) { try { @@ -646,6 +652,20 @@ export abstract class AbstractExtensionManagementService extends Disposable impl } } + private createInstallExtensionTask(manifest: IExtensionManifest, extension: URI | IGalleryExtension, options: InstallOptions & InstallVSIXOptions): IInstallExtensionTask { + if (options.profileLocation && isApplicationScopedExtension(manifest)) { + options = { ...options, profileLocation: this.userDataProfilesService.defaultProfile.extensionsResource }; + } + return this.doCreateInstallExtensionTask(manifest, extension, options); + } + + private createUninstallExtensionTask(extension: ILocalExtension, options: UninstallOptions): IUninstallExtensionTask { + if (options.profileLocation && extension.isApplicationScoped) { + options = { ...options, profileLocation: this.userDataProfilesService.defaultProfile.extensionsResource }; + } + return this.doCreateUninstallExtensionTask(extension, options); + } + abstract getTargetPlatform(): Promise; abstract zip(extension: ILocalExtension): Promise; abstract unzip(zipLocation: URI): Promise; @@ -653,14 +673,13 @@ export abstract class AbstractExtensionManagementService extends Disposable impl abstract install(vsix: URI, options?: InstallVSIXOptions): Promise; abstract getInstalled(type?: ExtensionType, profileLocation?: URI): Promise; abstract download(extension: IGalleryExtension, operation: InstallOperation): Promise; - abstract reinstallFromGallery(extension: ILocalExtension): Promise; abstract getMetadata(extension: ILocalExtension): Promise; abstract updateMetadata(local: ILocalExtension, metadata: IGalleryMetadata): Promise; abstract updateExtensionScope(local: ILocalExtension, isMachineScoped: boolean): Promise; - protected abstract createInstallExtensionTask(manifest: IExtensionManifest, extension: URI | IGalleryExtension, options: InstallExtensionTaskOptions): IInstallExtensionTask; - protected abstract createUninstallExtensionTask(extension: ILocalExtension, options: UninstallExtensionTaskOptions): IUninstallExtensionTask; + protected abstract doCreateInstallExtensionTask(manifest: IExtensionManifest, extension: URI | IGalleryExtension, options: InstallOptions & InstallVSIXOptions): IInstallExtensionTask; + protected abstract doCreateUninstallExtensionTask(extension: ILocalExtension, options: UninstallOptions): IUninstallExtensionTask; } export function joinErrors(errorOrErrors: (Error | string) | (Array)): Error { diff --git a/src/vs/platform/extensionManagement/common/extensionManagement.ts b/src/vs/platform/extensionManagement/common/extensionManagement.ts index 89907b63d3c..ba3a2b083ce 100644 --- a/src/vs/platform/extensionManagement/common/extensionManagement.ts +++ b/src/vs/platform/extensionManagement/common/extensionManagement.ts @@ -16,7 +16,6 @@ import { createDecorator } from 'vs/platform/instantiation/common/instantiation' export const EXTENSION_IDENTIFIER_PATTERN = '^([a-z0-9A-Z][a-z0-9-A-Z]*)\\.([a-z0-9A-Z][a-z0-9-A-Z]*)$'; export const EXTENSION_IDENTIFIER_REGEX = new RegExp(EXTENSION_IDENTIFIER_PATTERN); export const WEB_EXTENSION_TAG = '__web_extension'; -export const DEFAULT_PROFILE_EXTENSIONS_MIGRATION_KEY = 'DEFAULT_PROFILE_EXTENSIONS_MIGRATION'; export function TargetPlatformToString(targetPlatform: TargetPlatform) { switch (targetPlatform) { @@ -499,11 +498,13 @@ export interface IExtensionTipsService { getAllWorkspacesTips(): Promise; } + export const ExtensionsLabel = localize('extensions', "Extensions"); export const ExtensionsLocalizedLabel = { value: ExtensionsLabel, original: 'Extensions' }; export const PreferencesLabel = localize('preferences', "Preferences"); export const PreferencesLocalizedLabel = { value: PreferencesLabel, original: 'Preferences' }; + export interface CLIOutput { log(s: string): void; error(s: string): void; diff --git a/src/vs/platform/extensionManagement/common/extensionsProfileScannerService.ts b/src/vs/platform/extensionManagement/common/extensionsProfileScannerService.ts index 5bcb3ee7cdc..a182f889b9f 100644 --- a/src/vs/platform/extensionManagement/common/extensionsProfileScannerService.ts +++ b/src/vs/platform/extensionManagement/common/extensionsProfileScannerService.ts @@ -54,7 +54,7 @@ export class ExtensionsProfileScannerService extends Disposable implements IExte return this.withProfileExtensions(profileLocation); } - addExtensionsToProfile(extensions: [IExtension, Metadata | undefined][], profileLocation: URI): Promise { + addExtensionsToProfile(extensions: [IExtension, Metadata][], profileLocation: URI): Promise { return this.withProfileExtensions(profileLocation, profileExtensions => { // Remove the existing extension to avoid duplicates profileExtensions = profileExtensions.filter(e => extensions.some(([extension]) => !areSameExtensions(e.identifier, extension.identifier))); diff --git a/src/vs/platform/extensionManagement/common/extensionsScannerService.ts b/src/vs/platform/extensionManagement/common/extensionsScannerService.ts index 3a49730edd0..9ecfff2b321 100644 --- a/src/vs/platform/extensionManagement/common/extensionsScannerService.ts +++ b/src/vs/platform/extensionManagement/common/extensionsScannerService.ts @@ -190,9 +190,8 @@ export abstract class AbstractExtensionsScannerService extends Disposable implem } async scanUserExtensions(scanOptions: ScanOptions): Promise { - const location = scanOptions.profileLocation ?? this.userExtensionsLocation; - this.logService.trace('Started scanning user extensions', location); - const extensionsScannerInput = await this.createExtensionScannerInput(location, !!scanOptions.profileLocation, ExtensionType.User, !scanOptions.includeUninstalled, scanOptions.language); + this.logService.trace('Started scanning user extensions'); + const extensionsScannerInput = await this.createExtensionScannerInput(scanOptions.profileLocation ?? this.userExtensionsLocation, !!scanOptions.profileLocation, ExtensionType.User, !scanOptions.includeUninstalled, scanOptions.language); const extensionsScanner = scanOptions.useCache && !extensionsScannerInput.devMode && extensionsScannerInput.excludeObsolete ? this.userExtensionsCachedScanner : this.extensionsScanner; let extensions = await extensionsScanner.scanExtensions(extensionsScannerInput); extensions = await this.applyScanOptions(extensions, ExtensionType.User, scanOptions, true); diff --git a/src/vs/platform/extensionManagement/electron-main/defaultExtensionsProfileInit.ts b/src/vs/platform/extensionManagement/electron-main/defaultExtensionsProfileInit.ts new file mode 100644 index 00000000000..12e63157320 --- /dev/null +++ b/src/vs/platform/extensionManagement/electron-main/defaultExtensionsProfileInit.ts @@ -0,0 +1,57 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Disposable } from 'vs/base/common/lifecycle'; +import { joinPath } from 'vs/base/common/resources'; +import { URI } from 'vs/base/common/uri'; +import { IExtensionsProfileScannerService } from 'vs/platform/extensionManagement/common/extensionsProfileScannerService'; +import { IExtensionsScannerService } from 'vs/platform/extensionManagement/common/extensionsScannerService'; +import { IFileService } from 'vs/platform/files/common/files'; +import { ILogService } from 'vs/platform/log/common/log'; +import { EXTENSIONS_RESOURCE_NAME } from 'vs/platform/userDataProfile/common/userDataProfile'; +import { IUserDataProfilesMainService } from 'vs/platform/userDataProfile/electron-main/userDataProfile'; + +export class DefaultExtensionsProfileInitHandler extends Disposable { + constructor( + @IUserDataProfilesMainService private readonly userDataProfilesService: IUserDataProfilesMainService, + @IFileService private readonly fileService: IFileService, + @IExtensionsScannerService private readonly extensionsScannerService: IExtensionsScannerService, + @IExtensionsProfileScannerService private readonly extensionsProfileScannerService: IExtensionsProfileScannerService, + @ILogService logService: ILogService, + ) { + super(); + if (userDataProfilesService.isEnabled()) { + this._register(userDataProfilesService.onWillCreateProfile(e => { + if (userDataProfilesService.profiles.length === 1) { + e.join(this.initialize()); + } + })); + this._register(userDataProfilesService.onDidChangeProfiles(e => { + if (userDataProfilesService.profiles.length === 1) { + this.uninitialize(); + } + })); + } else { + this.uninitialize().then(null, e => logService.error(e)); + } + } + + private async initialize(): Promise { + /* Create and populate the default extensions profile resource */ + const extensionsProfileResource = this.getDefaultExtensionsProfileResource(); + try { await this.fileService.del(extensionsProfileResource); } catch (error) { /* ignore */ } + const userExtensions = await this.extensionsScannerService.scanUserExtensions({ includeInvalid: true }); + await this.extensionsProfileScannerService.addExtensionsToProfile(userExtensions.map(e => [e, e.metadata]), extensionsProfileResource); + } + + private async uninitialize(): Promise { + /* Remove the default extensions profile resource */ + try { await this.fileService.del(this.getDefaultExtensionsProfileResource()); } catch (error) { /* ignore */ } + } + + private getDefaultExtensionsProfileResource(): URI { + return this.userDataProfilesService.defaultProfile.extensionsResource ?? joinPath(this.userDataProfilesService.defaultProfile.location, EXTENSIONS_RESOURCE_NAME); + } +} diff --git a/src/vs/platform/extensionManagement/node/extensionManagementService.ts b/src/vs/platform/extensionManagement/node/extensionManagementService.ts index 34dc946046b..520c5667aae 100644 --- a/src/vs/platform/extensionManagement/node/extensionManagementService.ts +++ b/src/vs/platform/extensionManagement/node/extensionManagementService.ts @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ import { Promises, Queue } from 'vs/base/common/async'; -import { VSBuffer } from 'vs/base/common/buffer'; import { CancellationToken } from 'vs/base/common/cancellation'; import { IStringDictionary } from 'vs/base/common/collections'; import { toErrorMessage } from 'vs/base/common/errorMessage'; @@ -23,10 +22,10 @@ import { extract, ExtractError, IFile, zip } from 'vs/base/node/zip'; import * as nls from 'vs/nls'; import { IDownloadService } from 'vs/platform/download/common/download'; import { INativeEnvironmentService } from 'vs/platform/environment/common/environment'; -import { AbstractExtensionManagementService, AbstractExtensionTask, IInstallExtensionTask, InstallExtensionTaskOptions, IUninstallExtensionTask, joinErrors, UninstallExtensionTaskOptions } from 'vs/platform/extensionManagement/common/abstractExtensionManagementService'; +import { AbstractExtensionManagementService, AbstractExtensionTask, IInstallExtensionTask, IUninstallExtensionTask, joinErrors } from 'vs/platform/extensionManagement/common/abstractExtensionManagementService'; import { ExtensionManagementError, ExtensionManagementErrorCode, IExtensionGalleryService, IExtensionIdentifier, IExtensionManagementService, IGalleryExtension, IGalleryMetadata, ILocalExtension, InstallOperation, - Metadata, InstallOptions, InstallVSIXOptions + Metadata, InstallOptions, InstallVSIXOptions, UninstallOptions } from 'vs/platform/extensionManagement/common/extensionManagement'; import { areSameExtensions, computeTargetPlatform, ExtensionKey, getGalleryExtensionId, groupByExtension } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { IExtensionsProfileScannerService } from 'vs/platform/extensionManagement/common/extensionsProfileScannerService'; @@ -55,9 +54,7 @@ interface InstallableExtension { export const INativeServerExtensionManagementService = refineServiceDecorator(IExtensionManagementService); export interface INativeServerExtensionManagementService extends IExtensionManagementService { readonly _serviceBrand: undefined; - migrateDefaultProfileExtensions(): Promise; - markAsUninstalled(...extensions: ILocalExtension[]): Promise; - removeUninstalledExtensions(): Promise; + removeUninstalledExtensions(removeOutdated: boolean): Promise; getAllUserInstalled(): Promise; } @@ -88,13 +85,13 @@ export class ExtensionManagementService extends AbstractExtensionManagementServi this.extensionsScanner = this._register(instantiationService.createInstance(ExtensionsScanner, extension => extensionLifecycle.postUninstall(extension))); this.manifestCache = this._register(new ExtensionsManifestCache(environmentService, this)); this.extensionsDownloader = this._register(instantiationService.createInstance(ExtensionsDownloader)); - const extensionsWatcher = this._register(new ExtensionsWatcher(this, userDataProfilesService, extensionsProfileScannerService, extensionsScannerService, uriIdentityService, fileService, logService)); + const extensionsWatcher = this._register(new ExtensionsWatcher(this, fileService, environmentService, logService, uriIdentityService)); this._register(extensionsWatcher.onDidChangeExtensionsByAnotherSource(({ added, removed }) => { if (added.length) { - this._onDidInstallExtensions.fire(added); + this._onDidInstallExtensions.fire(added.map(local => ({ identifier: local.identifier, operation: InstallOperation.None, local }))); } - removed.forEach(e => this._onDidUninstallExtension.fire(e)); + removed.forEach(extension => this._onDidUninstallExtension.fire({ identifier: extension })); })); } @@ -134,7 +131,7 @@ export class ExtensionManagementService extends AbstractExtensionManagementServi } getAllUserInstalled(): Promise { - return this.extensionsScanner.scanAllUserExtensions(false); + return this.extensionsScanner.scanUserExtensions(false); } async install(vsix: URI, options: InstallVSIXOptions = {}): Promise { @@ -176,37 +173,8 @@ export class ExtensionManagementService extends AbstractExtensionManagementServi return local; } - async reinstallFromGallery(extension: ILocalExtension): Promise { - this.logService.trace('ExtensionManagementService#reinstallFromGallery', extension.identifier.id); - if (!this.galleryService.isEnabled()) { - throw new Error(nls.localize('MarketPlaceDisabled', "Marketplace is not enabled")); - } - - const targetPlatform = await this.getTargetPlatform(); - const [galleryExtension] = await this.galleryService.getExtensions([{ ...extension.identifier, preRelease: extension.preRelease }], { targetPlatform, compatible: true }, CancellationToken.None); - if (!galleryExtension) { - throw new Error(nls.localize('Not a Marketplace extension', "Only Marketplace Extensions can be reinstalled")); - } - - await this.extensionsScanner.setUninstalled(extension); - try { - await this.extensionsScanner.removeUninstalledExtension(extension); - } catch (e) { - throw new Error(nls.localize('removeError', "Error while removing the extension: {0}. Please Quit and Start VS Code before trying again.", toErrorMessage(e))); - } - await this.installFromGallery(galleryExtension); - } - - markAsUninstalled(...extensions: ILocalExtension[]): Promise { - return this.extensionsScanner.setUninstalled(...extensions); - } - - removeUninstalledExtensions(): Promise { - return this.extensionsScanner.cleanUp(); - } - - migrateDefaultProfileExtensions(): Promise { - return this.extensionsScanner.migrateDefaultProfileExtensions(); + removeUninstalledExtensions(removeOutdated: boolean): Promise { + return this.extensionsScanner.cleanUp(removeOutdated); } async download(extension: IGalleryExtension, operation: InstallOperation): Promise { @@ -232,7 +200,7 @@ export class ExtensionManagementService extends AbstractExtensionManagementServi return { location, cleanup }; } - protected createInstallExtensionTask(manifest: IExtensionManifest, extension: URI | IGalleryExtension, options: InstallExtensionTaskOptions): IInstallExtensionTask { + protected doCreateInstallExtensionTask(manifest: IExtensionManifest, extension: URI | IGalleryExtension, options: InstallOptions & InstallVSIXOptions): IInstallExtensionTask { let installExtensionTask: IInstallExtensionTask | undefined; if (URI.isUri(extension)) { installExtensionTask = new InstallVSIXTask(manifest, extension, options, this.galleryService, this.extensionsScanner, this.logService); @@ -244,11 +212,17 @@ export class ExtensionManagementService extends AbstractExtensionManagementServi installExtensionTask.waitUntilTaskIsFinished().then(() => this.installGalleryExtensionsTasks.delete(key)); } } - return new InstallExtensionInProfileTask(installExtensionTask, options.profileLocation, this.extensionsProfileScannerService); + if (options.profileLocation) { + return new InstallExtensionInProfileTask(installExtensionTask, options.profileLocation, this.extensionsProfileScannerService); + } + return installExtensionTask; } - protected createUninstallExtensionTask(extension: ILocalExtension, options: UninstallExtensionTaskOptions): IUninstallExtensionTask { - return new UninstallExtensionFromProfileTask(extension, options.profileLocation, this.extensionsProfileScannerService); + protected doCreateUninstallExtensionTask(extension: ILocalExtension, options: UninstallOptions): IUninstallExtensionTask { + if (options.profileLocation) { + return new UninstallExtensionFromProfileTask(extension, options.profileLocation, this.extensionsProfileScannerService); + } + return new UninstallExtensionTask(extension, options, this.extensionsScanner); } private async collectFiles(extension: ILocalExtension): Promise { @@ -287,8 +261,6 @@ export class ExtensionsScanner extends Disposable { private readonly beforeRemovingExtension: (e: ILocalExtension) => Promise, @IFileService private readonly fileService: IFileService, @IExtensionsScannerService private readonly extensionsScannerService: IExtensionsScannerService, - @IUserDataProfilesService private readonly userDataProfilesService: IUserDataProfilesService, - @IExtensionsProfileScannerService private readonly extensionsProfileScannerService: IExtensionsProfileScannerService, @ILogService private readonly logService: ILogService, ) { super(); @@ -296,12 +268,14 @@ export class ExtensionsScanner extends Disposable { this.uninstalledFileLimiter = new Queue(); } - async cleanUp(): Promise { + async cleanUp(removeOutdated: boolean): Promise { await this.removeUninstalledExtensions(); + if (removeOutdated) { + await this.removeOutdatedExtensions(); + } } async scanExtensions(type: ExtensionType | null, profileLocation: URI | undefined): Promise { - await this.migrateDefaultProfileExtensions(); const userScanOptions: ScanOptions = { includeInvalid: true, profileLocation }; let scannedExtensions: IScannedExtension[] = []; if (type === null || type === ExtensionType.System) { @@ -313,13 +287,12 @@ export class ExtensionsScanner extends Disposable { return Promise.all(scannedExtensions.map(extension => this.toLocalExtension(extension))); } - async scanAllUserExtensions(excludeOutdated: boolean): Promise { + async scanUserExtensions(excludeOutdated: boolean): Promise { const scannedExtensions = await this.extensionsScannerService.scanUserExtensions({ includeAllVersions: !excludeOutdated, includeInvalid: true }); return Promise.all(scannedExtensions.map(extension => this.toLocalExtension(extension))); } async extractUserExtension(extensionKey: ExtensionKey, zipPath: string, metadata: Metadata, token: CancellationToken): Promise { - await this.migrateDefaultProfileExtensions(); const folderName = extensionKey.toString(); const tempPath = path.join(this.extensionsScannerService.userExtensionsLocation.fsPath, `.${generateUuid()}`); const extensionPath = path.join(this.extensionsScannerService.userExtensionsLocation.fsPath, folderName); @@ -362,16 +335,14 @@ export class ExtensionsScanner extends Disposable { async setUninstalled(...extensions: ILocalExtension[]): Promise { const extensionKeys: ExtensionKey[] = extensions.map(e => ExtensionKey.create(e)); - await this.withUninstalledExtensions(uninstalled => - extensionKeys.forEach(extensionKey => { - uninstalled[extensionKey.toString()] = true; - this.logService.info('Marked extension as uninstalled', extensionKey.toString()); - })); + await this.withUninstalledExtensions(uninstalled => { + extensionKeys.forEach(extensionKey => uninstalled[extensionKey.toString()] = true); + }); } async setInstalled(extensionKey: ExtensionKey): Promise { await this.withUninstalledExtensions(uninstalled => delete uninstalled[extensionKey.toString()]); - const userExtensions = await this.scanAllUserExtensions(true); + const userExtensions = await this.scanUserExtensions(true); const localExtension = userExtensions.find(i => ExtensionKey.create(i).equals(extensionKey)) || null; if (!localExtension) { return null; @@ -518,33 +489,35 @@ export class ExtensionsScanner extends Disposable { await Promises.settled(toRemove.map(e => this.removeUninstalledExtension(e))); } - private _migrateDefaultProfileExtensionsPromise: Promise | undefined = undefined; - migrateDefaultProfileExtensions(): Promise { - if (!this._migrateDefaultProfileExtensionsPromise) { - this._migrateDefaultProfileExtensionsPromise = (async () => { - try { - const migrationMarkerFile = joinPath(this.extensionsScannerService.userExtensionsLocation, '.migrated-default-profile'); - if (await this.fileService.exists(migrationMarkerFile)) { - return; + private async removeOutdatedExtensions(): Promise { + const systemExtensions = await this.extensionsScannerService.scanSystemExtensions({}); // System extensions + const extensions = await this.extensionsScannerService.scanUserExtensions({ includeAllVersions: true, includeUninstalled: true, includeInvalid: true }); // All user extensions + const toRemove: IScannedExtension[] = []; + + // Outdated extensions + const targetPlatform = await this.extensionsScannerService.getTargetPlatform(); + const byExtension = groupByExtension(extensions, e => e.identifier); + for (const extensions of byExtension) { + if (extensions.length > 1) { + toRemove.push(...extensions.sort((a, b) => { + const vcompare = semver.rcompare(a.manifest.version, b.manifest.version); + if (vcompare !== 0) { + return vcompare; } - if (!(await this.fileService.exists(this.userDataProfilesService.defaultProfile.extensionsResource))) { - this.logService.info('Started migrating default profile extensions from extensions installation folder to extensions manifest.'); - const userExtensions = await this.extensionsScannerService.scanUserExtensions({ includeInvalid: true }); - await this.extensionsProfileScannerService.addExtensionsToProfile(userExtensions.map(e => [e, e.metadata]), this.userDataProfilesService.defaultProfile.extensionsResource); - this.logService.info('Completed migrating default profile extensions from extensions installation folder to extensions manifest.'); + if (a.targetPlatform === targetPlatform) { + return -1; } - try { - await this.fileService.createFile(migrationMarkerFile, VSBuffer.fromString('')); - } catch (error) { - this.logService.warn('Failed to create migration marker file for default profile extensions migration.', getErrorMessage(error)); - } - } catch (error) { - this.logService.error(error); - throw error; + return 1; + }).slice(1)); + } + if (extensions[0].type === ExtensionType.System) { + const systemExtension = systemExtensions.find(e => areSameExtensions(e.identifier, extensions[0].identifier)); + if (!systemExtension || semver.gte(systemExtension.manifest.version, extensions[0].manifest.version)) { + toRemove.push(extensions[0]); } - })(); + } } - return this._migrateDefaultProfileExtensionsPromise; + await Promises.settled(toRemove.map(extension => this.removeExtension(extension, 'outdated'))); } private joinErrors(errorOrErrors: (Error | string) | (Array)): Error { @@ -802,6 +775,46 @@ class InstallExtensionInProfileTask implements IInstallExtensionTask { } } +class UninstallExtensionTask extends AbstractExtensionTask implements IUninstallExtensionTask { + + constructor( + readonly extension: ILocalExtension, + private readonly options: UninstallOptions, + private readonly extensionsScanner: ExtensionsScanner, + ) { + super(); + } + + protected async doRun(token: CancellationToken): Promise { + const toUninstall: ILocalExtension[] = []; + const userExtensions = await this.extensionsScanner.scanUserExtensions(false); + if (this.options.versionOnly) { + const extensionKey = ExtensionKey.create(this.extension); + toUninstall.push(...userExtensions.filter(u => extensionKey.equals(ExtensionKey.create(u)))); + } else { + toUninstall.push(...userExtensions.filter(u => areSameExtensions(u.identifier, this.extension.identifier))); + } + + if (!toUninstall.length) { + throw new Error(nls.localize('notInstalled', "Extension '{0}' is not installed.", this.extension.manifest.displayName || this.extension.manifest.name)); + } + await this.extensionsScanner.setUninstalled(...toUninstall); + + if (this.options.remove) { + for (const extension of toUninstall) { + try { + if (!token.isCancellationRequested) { + await this.extensionsScanner.removeUninstalledExtension(extension); + } + } catch (e) { + throw new Error(nls.localize('removeError', "Error while removing the extension: {0}. Please Quit and Start VS Code before trying again.", toErrorMessage(e))); + } + } + } + } + +} + class UninstallExtensionFromProfileTask extends AbstractExtensionTask implements IUninstallExtensionTask { constructor( diff --git a/src/vs/platform/extensionManagement/node/extensionsWatcher.ts b/src/vs/platform/extensionManagement/node/extensionsWatcher.ts index e04c1b8b869..2693b4e10bd 100644 --- a/src/vs/platform/extensionManagement/node/extensionsWatcher.ts +++ b/src/vs/platform/extensionManagement/node/extensionsWatcher.ts @@ -6,49 +6,42 @@ import { Emitter, Event } from 'vs/base/common/event'; import { Disposable } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; -import { DidUninstallExtensionEvent, InstallExtensionResult, InstallOperation } from 'vs/platform/extensionManagement/common/extensionManagement'; -import { getIdAndVersion } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; -import { IExtensionsProfileScannerService } from 'vs/platform/extensionManagement/common/extensionsProfileScannerService'; -import { IExtensionsScannerService } from 'vs/platform/extensionManagement/common/extensionsScannerService'; -import { INativeServerExtensionManagementService } from 'vs/platform/extensionManagement/node/extensionManagementService'; -import { ExtensionIdentifier, IExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; +import { INativeEnvironmentService } from 'vs/platform/environment/common/environment'; +import { DidUninstallExtensionEvent, IExtensionManagementService, ILocalExtension, InstallExtensionEvent, InstallExtensionResult } from 'vs/platform/extensionManagement/common/extensionManagement'; +import { areSameExtensions } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; +import { IExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; import { FileChangeType, IFileChange, IFileService } from 'vs/platform/files/common/files'; import { ILogService } from 'vs/platform/log/common/log'; import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; -import { IUserDataProfile, IUserDataProfilesService } from 'vs/platform/userDataProfile/common/userDataProfile'; export class ExtensionsWatcher extends Disposable { - private readonly _onDidChangeExtensionsByAnotherSource = this._register(new Emitter<{ added: InstallExtensionResult[]; removed: DidUninstallExtensionEvent[] }>()); + private readonly _onDidChangeExtensionsByAnotherSource = this._register(new Emitter<{ added: ILocalExtension[]; removed: IExtensionIdentifier[] }>()); readonly onDidChangeExtensionsByAnotherSource = this._onDidChangeExtensionsByAnotherSource.event; - private readonly profileExtensionsLocations = new Map; + private startTimestamp = 0; + private installingExtensions: IExtensionIdentifier[] = []; + private installedExtensions: IExtensionIdentifier[] | undefined; constructor( - private readonly extensionManagementService: INativeServerExtensionManagementService, - private readonly userDataProfilesService: IUserDataProfilesService, - private readonly extensionsProfileScannerService: IExtensionsProfileScannerService, - private readonly extensionsScannerService: IExtensionsScannerService, - private readonly uriIdentityService: IUriIdentityService, - private readonly fileService: IFileService, - private readonly logService: ILogService, + private readonly extensionsManagementService: IExtensionManagementService, + @IFileService fileService: IFileService, + @INativeEnvironmentService environmentService: INativeEnvironmentService, + @ILogService private readonly logService: ILogService, + @IUriIdentityService private readonly uriIdentityService: IUriIdentityService, ) { super(); - this.initialize().then(() => this.registerListeners(), error => logService.error(error)); - } + this.extensionsManagementService.getInstalled().then(extensions => { + this.installedExtensions = extensions.map(e => e.identifier); + this.startTimestamp = Date.now(); + }); + this._register(extensionsManagementService.onInstallExtension(e => this.onInstallExtension(e))); + this._register(extensionsManagementService.onDidInstallExtensions(e => this.onDidInstallExtensions(e))); + this._register(extensionsManagementService.onDidUninstallExtension(e => this.onDidUninstallExtension(e))); - private async initialize(): Promise { - await this.extensionManagementService.migrateDefaultProfileExtensions(); - await this.onDidChangeProfiles(this.userDataProfilesService.profiles, []); - await this.uninstallExtensionsNotInProfiles(); - } - - private registerListeners(): void { - this._register(this.userDataProfilesService.onDidChangeProfiles(e => this.onDidChangeProfiles(e.added, e.removed))); - this._register(this.extensionManagementService.onDidInstallExtensions(e => this.onDidInstallExtensions(e))); - this._register(this.extensionManagementService.onDidUninstallExtension(e => this.onDidUninstallExtension(e))); - this._register(this.fileService.watch(this.extensionsScannerService.userExtensionsLocation)); - this._register(Event.filter(this.fileService.onDidFilesChange, e => e.rawChanges.some(change => this.doesChangeAffects(change, this.extensionsScannerService.userExtensionsLocation)))(() => this.onDidChange())); + const extensionsResource = URI.file(environmentService.extensionsPath); + this._register(fileService.watch(extensionsResource)); + this._register(Event.filter(fileService.onDidFilesChange, e => e.rawChanges.some(change => this.doesChangeAffects(change, extensionsResource)))(() => this.onDidChange())); } private doesChangeAffects(change: IFileChange, extensionsResource: URI): boolean { @@ -75,136 +68,78 @@ export class ExtensionsWatcher extends Disposable { return true; } + private onInstallExtension(e: InstallExtensionEvent): void { + this.addInstallingExtension(e.identifier); + } + + private onDidInstallExtensions(results: readonly InstallExtensionResult[]): void { + for (const e of results) { + this.removeInstallingExtension(e.identifier); + if (e.local) { + this.addInstalledExtension(e.identifier); + } + } + } + + private onDidUninstallExtension(e: DidUninstallExtensionEvent): void { + if (!e.error) { + this.removeInstalledExtension(e.identifier); + } + } + + private addInstallingExtension(extension: IExtensionIdentifier) { + this.removeInstallingExtension(extension); + this.installingExtensions.push(extension); + } + + private removeInstallingExtension(identifier: IExtensionIdentifier) { + this.installingExtensions = this.installingExtensions.filter(e => !areSameExtensions(e, identifier)); + } + + private addInstalledExtension(extension: IExtensionIdentifier): void { + if (this.installedExtensions) { + this.removeInstalledExtension(extension); + this.installedExtensions.push(extension); + } + } + + private removeInstalledExtension(identifier: IExtensionIdentifier): void { + if (this.installedExtensions) { + this.installedExtensions = this.installedExtensions.filter(e => !areSameExtensions(e, identifier)); + } + } + private async onDidChange(): Promise { - const installed = await this.extensionManagementService.getAllUserInstalled(); - const added = installed.filter(e => { - if (e.installedTimestamp !== undefined) { - return false; - } - if (this.profileExtensionsLocations.has(this.getKey(e.identifier, e.manifest.version))) { - return false; - } - this.logService.info('Detected extension installed from another source', e.identifier.id); - return true; - }); - if (added.length) { - await this.extensionsProfileScannerService.addExtensionsToProfile(added.map(e => [e, undefined]), this.userDataProfilesService.defaultProfile.extensionsResource); - this._onDidChangeExtensionsByAnotherSource.fire({ - added: added.map(local => ({ - identifier: local.identifier, - operation: InstallOperation.None, - profileLocation: this.userDataProfilesService.defaultProfile.extensionsResource, - local - })), - removed: [] + if (this.installedExtensions) { + const extensions = await this.extensionsManagementService.getInstalled(); + const added = extensions.filter(e => { + if ([...this.installingExtensions, ...this.installedExtensions!].some(identifier => areSameExtensions(identifier, e.identifier))) { + return false; + } + if (e.installedTimestamp && e.installedTimestamp > this.startTimestamp) { + this.logService.info('Detected extension installed from another source', e.identifier.id); + return true; + } else { + this.logService.info('Ignored extension installed by another source because of invalid timestamp', e.identifier.id); + return false; + } }); - } - } - - private async onDidChangeProfiles(added: readonly IUserDataProfile[], removed: readonly IUserDataProfile[]): Promise { - try { - await Promise.all(removed.map(profile => this.removeExtensionsFromProfile(profile.extensionsResource))); - } catch (error) { - this.logService.error(error); - } - - try { - if (added.length) { - await Promise.all(added.map(profile => this.populateExtensionsFromProfile(profile.extensionsResource))); - } - } catch (error) { - this.logService.error(error); - } - } - - private async uninstallExtensionsNotInProfiles(): Promise { - const installed = await this.extensionManagementService.getAllUserInstalled(); - const toUninstall = installed.filter(installedExtension => !this.profileExtensionsLocations.has(this.getKey(installedExtension.identifier, installedExtension.manifest.version))); - if (toUninstall.length) { - await this.extensionManagementService.markAsUninstalled(...toUninstall); - } - } - - private async onDidInstallExtensions(installedExtensions: readonly InstallExtensionResult[]): Promise { - for (const { local, profileLocation } of installedExtensions) { - if (!local || !profileLocation) { - continue; - } - this.addExtensionWithKey(this.getKey(local.identifier, local.manifest.version), profileLocation); - } - } - - private async onDidUninstallExtension(e: DidUninstallExtensionEvent): Promise { - if (!e.profileLocation || !e.version) { - return; - } - if (this.removeExtensionWithKey(this.getKey(e.identifier, e.version), e.profileLocation)) { - await this.uninstallExtensions([{ identifier: e.identifier, version: e.version }]); - } - } - - private async populateExtensionsFromProfile(extensionsProfileLocation: URI): Promise { - const extensions = await this.extensionsProfileScannerService.scanProfileExtensions(extensionsProfileLocation); - for (const extension of extensions) { - this.addExtensionWithKey(this.getKey(extension.identifier, extension.version), extensionsProfileLocation); - } - } - - private async removeExtensionsFromProfile(removedProfile: URI): Promise { - const extensionsToRemove: { identifier: IExtensionIdentifier; version: string }[] = []; - for (const key of [...this.profileExtensionsLocations.keys()]) { - if (!this.removeExtensionWithKey(key, removedProfile)) { - continue; - } - const extensionToRemove = this.fromKey(key); - if (extensionToRemove) { - extensionsToRemove.push(extensionToRemove); + const removed = this.installedExtensions.filter(identifier => { + // Extension being installed + if (this.installingExtensions.some(installingExtension => areSameExtensions(installingExtension, identifier))) { + return false; + } + if (extensions.every(e => !areSameExtensions(e.identifier, identifier))) { + this.logService.info('Detected extension removed from another source', identifier.id); + return true; + } + return false; + }); + this.installedExtensions = extensions.map(e => e.identifier); + if (added.length || removed.length) { + this._onDidChangeExtensionsByAnotherSource.fire({ added, removed }); } } - if (extensionsToRemove.length) { - await this.uninstallExtensions(extensionsToRemove); - } - } - - private addExtensionWithKey(key: string, extensionsProfileLocation: URI): void { - let locations = this.profileExtensionsLocations.get(key); - if (!locations) { - locations = []; - this.profileExtensionsLocations.set(key, locations); - } - locations.push(extensionsProfileLocation); - } - - private removeExtensionWithKey(key: string, profileLocation: URI): boolean { - const profiles = this.profileExtensionsLocations.get(key); - if (profiles) { - const index = profiles.findIndex(profile => this.uriIdentityService.extUri.isEqual(profile, profileLocation)); - if (index > -1) { - profiles.splice(index, 1); - } - } - if (!profiles?.length) { - this.profileExtensionsLocations.delete(key); - return true; - } - return false; - } - - private async uninstallExtensions(extensionsToRemove: { identifier: IExtensionIdentifier; version: string }[]): Promise { - const installed = await this.extensionManagementService.getAllUserInstalled(); - const toUninstall = installed.filter(installedExtension => extensionsToRemove.some(e => this.getKey(installedExtension.identifier, installedExtension.manifest.version) === this.getKey(e.identifier, e.version))); - if (toUninstall.length) { - await this.extensionManagementService.markAsUninstalled(...toUninstall); - } - } - - private getKey(identifier: IExtensionIdentifier, version: string): string { - return `${ExtensionIdentifier.toKey(identifier.id)}@${version}`; - } - - private fromKey(key: string): { identifier: IExtensionIdentifier; version: string } | undefined { - const [id, version] = getIdAndVersion(key); - return version ? { identifier: { id }, version } : undefined; } } diff --git a/src/vs/platform/userDataProfile/browser/userDataProfile.ts b/src/vs/platform/userDataProfile/browser/userDataProfile.ts index a3144510cf6..8d4253f2c88 100644 --- a/src/vs/platform/userDataProfile/browser/userDataProfile.ts +++ b/src/vs/platform/userDataProfile/browser/userDataProfile.ts @@ -16,6 +16,7 @@ type BroadcastedProfileChanges = UriDto>; export class BrowserUserDataProfilesService extends UserDataProfilesService implements IUserDataProfilesService { + protected override readonly defaultProfileShouldIncludeExtensionsResourceAlways: boolean = true; private readonly changesBroadcastChannel: BroadcastDataChannel; constructor( diff --git a/src/vs/platform/userDataProfile/common/userDataProfile.ts b/src/vs/platform/userDataProfile/common/userDataProfile.ts index b74d2b1cfde..2207f1a08e4 100644 --- a/src/vs/platform/userDataProfile/common/userDataProfile.ts +++ b/src/vs/platform/userDataProfile/common/userDataProfile.ts @@ -7,6 +7,7 @@ import { hash } from 'vs/base/common/hash'; import { Emitter, Event } from 'vs/base/common/event'; import { Disposable } from 'vs/base/common/lifecycle'; import { basename, joinPath } from 'vs/base/common/resources'; +import { isUndefined } from 'vs/base/common/types'; import { URI, UriDto } from 'vs/base/common/uri'; import { localize } from 'vs/nls'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; @@ -44,7 +45,7 @@ export interface IUserDataProfile { readonly keybindingsResource: URI; readonly tasksResource: URI; readonly snippetsHome: URI; - readonly extensionsResource: URI; + readonly extensionsResource: URI | undefined; readonly useDefaultFlags?: UseDefaultProfileFlags; readonly isTransient?: boolean; } @@ -62,7 +63,7 @@ export function isUserDataProfile(thing: unknown): thing is IUserDataProfile { && URI.isUri(candidate.keybindingsResource) && URI.isUri(candidate.tasksResource) && URI.isUri(candidate.snippetsHome) - && URI.isUri(candidate.extensionsResource) + && (isUndefined(candidate.extensionsResource) || URI.isUri(candidate.extensionsResource)) ); } @@ -137,6 +138,8 @@ export function reviveProfile(profile: UriDto, scheme: string) }; } +export const EXTENSIONS_RESOURCE_NAME = 'extensions.json'; + export function toUserDataProfile(id: string, name: string, location: URI, options?: IUserDataProfileOptions): IUserDataProfile { return { id, @@ -149,7 +152,7 @@ export function toUserDataProfile(id: string, name: string, location: URI, optio keybindingsResource: joinPath(location, 'keybindings.json'), tasksResource: joinPath(location, 'tasks.json'), snippetsHome: joinPath(location, 'snippets'), - extensionsResource: joinPath(location, 'extensions.json'), + extensionsResource: joinPath(location, EXTENSIONS_RESOURCE_NAME), useDefaultFlags: options?.useDefaultFlags, isTransient: options?.transient }; @@ -181,6 +184,7 @@ export class UserDataProfilesService extends Disposable implements IUserDataProf readonly _serviceBrand: undefined; protected enabled: boolean = false; + protected readonly defaultProfileShouldIncludeExtensionsResourceAlways: boolean = false; readonly profilesHome: URI; get defaultProfile(): IUserDataProfile { return this.profiles[0]; } @@ -233,7 +237,7 @@ export class UserDataProfilesService extends Disposable implements IUserDataProf let emptyWindow: IUserDataProfile | undefined; const workspaces = new ResourceMap(); const defaultProfile = toUserDataProfile(hash(this.environmentService.userRoamingDataHome.path).toString(16), localize('defaultProfile', "Default"), this.environmentService.userRoamingDataHome); - profiles.unshift({ ...defaultProfile, isDefault: true }); + profiles.unshift({ ...defaultProfile, isDefault: true, extensionsResource: this.defaultProfileShouldIncludeExtensionsResourceAlways || profiles.length > 0 || this.transientProfilesObject.profiles.length > 0 ? defaultProfile.extensionsResource : undefined }); if (profiles.length) { const profileAssicaitions = this.getStoredProfileAssociations(); if (profileAssicaitions.workspaces) { diff --git a/src/vs/platform/userDataProfile/test/common/userDataProfileService.test.ts b/src/vs/platform/userDataProfile/test/common/userDataProfileService.test.ts index e146018fb7c..80475cfdc10 100644 --- a/src/vs/platform/userDataProfile/test/common/userDataProfileService.test.ts +++ b/src/vs/platform/userDataProfile/test/common/userDataProfileService.test.ts @@ -54,12 +54,13 @@ suite('UserDataProfileService (Common)', () => { assert.strictEqual(testObject.defaultProfile.settingsResource.toString(), joinPath(environmentService.userRoamingDataHome, 'settings.json').toString()); assert.strictEqual(testObject.defaultProfile.snippetsHome.toString(), joinPath(environmentService.userRoamingDataHome, 'snippets').toString()); assert.strictEqual(testObject.defaultProfile.tasksResource.toString(), joinPath(environmentService.userRoamingDataHome, 'tasks.json').toString()); - assert.strictEqual(testObject.defaultProfile.extensionsResource.toString(), joinPath(environmentService.userRoamingDataHome, 'extensions.json').toString()); + assert.strictEqual(testObject.defaultProfile.extensionsResource, undefined); }); test('profiles always include default profile', () => { assert.deepStrictEqual(testObject.profiles.length, 1); assert.deepStrictEqual(testObject.profiles[0].isDefault, true); + assert.deepStrictEqual(testObject.profiles[0].extensionsResource, undefined); }); test('create profile with id', async () => { @@ -115,6 +116,7 @@ suite('UserDataProfileService (Common)', () => { assert.deepStrictEqual(testObject.profiles.length, 2); assert.deepStrictEqual(testObject.profiles[0].isDefault, true); + assert.deepStrictEqual(testObject.profiles[0].extensionsResource?.toString(), joinPath(environmentService.userRoamingDataHome, 'extensions.json').toString()); }); test('profiles include default profile with extension resource undefined when transiet prrofile is removed', async () => { @@ -123,6 +125,7 @@ suite('UserDataProfileService (Common)', () => { assert.deepStrictEqual(testObject.profiles.length, 1); assert.deepStrictEqual(testObject.profiles[0].isDefault, true); + assert.deepStrictEqual(testObject.profiles[0].extensionsResource, undefined); }); test('update named profile', async () => { diff --git a/src/vs/platform/userDataProfile/test/electron-main/userDataProfileMainService.test.ts b/src/vs/platform/userDataProfile/test/electron-main/userDataProfileMainService.test.ts index ddca6884601..7078f0757a4 100644 --- a/src/vs/platform/userDataProfile/test/electron-main/userDataProfileMainService.test.ts +++ b/src/vs/platform/userDataProfile/test/electron-main/userDataProfileMainService.test.ts @@ -51,22 +51,26 @@ suite('UserDataProfileMainService', () => { test('default profile', () => { assert.strictEqual(testObject.defaultProfile.isDefault, true); + assert.strictEqual(testObject.defaultProfile.extensionsResource, undefined); }); test('profiles always include default profile', () => { assert.deepStrictEqual(testObject.profiles.length, 1); assert.deepStrictEqual(testObject.profiles[0].isDefault, true); + assert.deepStrictEqual(testObject.profiles[0].extensionsResource, undefined); }); test('default profile when there are profiles', async () => { await testObject.createNamedProfile('test'); assert.strictEqual(testObject.defaultProfile.isDefault, true); + assert.strictEqual(testObject.defaultProfile.extensionsResource?.toString(), joinPath(environmentService.userRoamingDataHome, 'extensions.json').toString()); }); test('default profile when profiles are removed', async () => { const profile = await testObject.createNamedProfile('test'); await testObject.removeProfile(profile); assert.strictEqual(testObject.defaultProfile.isDefault, true); + assert.strictEqual(testObject.defaultProfile.extensionsResource, undefined); }); }); diff --git a/src/vs/platform/userDataSync/common/extensionsSync.ts b/src/vs/platform/userDataSync/common/extensionsSync.ts index 4e61627c14d..87098ee8e71 100644 --- a/src/vs/platform/userDataSync/common/extensionsSync.ts +++ b/src/vs/platform/userDataSync/common/extensionsSync.ts @@ -113,7 +113,7 @@ export class ExtensionsSynchroniser extends AbstractSynchroniser implements IUse constructor( // profileLocation changes for default profile - profile: IUserDataProfile, + public profile: IUserDataProfile, collection: string | undefined, @IEnvironmentService environmentService: IEnvironmentService, @IFileService fileService: IFileService, @@ -147,7 +147,7 @@ export class ExtensionsSynchroniser extends AbstractSynchroniser implements IUse const builtinExtensions: IExtensionIdentifier[] = lastSyncUserData?.builtinExtensions || []; const lastSyncExtensions: ISyncExtension[] | null = lastSyncUserData?.syncData ? await parseAndMigrateExtensions(lastSyncUserData.syncData, this.extensionManagementService) : null; - const { localExtensions, ignoredExtensions } = await this.localExtensionsProvider.getLocalExtensions(this.syncResource.profile); + const { localExtensions, ignoredExtensions } = await this.localExtensionsProvider.getLocalExtensions(this.profile); if (remoteExtensions) { this.logService.trace(`${this.syncResourceLogLabel}: Merging remote extensions with local extensions...`); @@ -185,7 +185,7 @@ export class ExtensionsSynchroniser extends AbstractSynchroniser implements IUse protected async hasRemoteChanged(lastSyncUserData: ILastSyncUserData): Promise { const lastSyncExtensions: ISyncExtension[] | null = lastSyncUserData.syncData ? await parseAndMigrateExtensions(lastSyncUserData.syncData, this.extensionManagementService) : null; - const { localExtensions, ignoredExtensions } = await this.localExtensionsProvider.getLocalExtensions(this.syncResource.profile); + const { localExtensions, ignoredExtensions } = await this.localExtensionsProvider.getLocalExtensions(this.profile); const { remote } = merge(localExtensions, lastSyncExtensions, lastSyncExtensions, lastSyncUserData.skippedExtensions || [], ignoredExtensions, lastSyncUserData.builtinExtensions || []); return remote !== null; } @@ -239,7 +239,7 @@ export class ExtensionsSynchroniser extends AbstractSynchroniser implements IUse } private async acceptLocal(resourcePreview: IExtensionResourcePreview): Promise { - const installedExtensions = await this.extensionManagementService.getInstalled(undefined, this.syncResource.profile.extensionsResource); + const installedExtensions = await this.extensionManagementService.getInstalled(undefined, this.profile.location); const ignoredExtensions = this.ignoredExtensionsManagementService.getIgnoredExtensions(installedExtensions); const mergeResult = merge(resourcePreview.localExtensions, null, null, resourcePreview.skippedExtensions, ignoredExtensions, resourcePreview.builtinExtensions); const { local, remote } = mergeResult; @@ -253,7 +253,7 @@ export class ExtensionsSynchroniser extends AbstractSynchroniser implements IUse } private async acceptRemote(resourcePreview: IExtensionResourcePreview): Promise { - const installedExtensions = await this.extensionManagementService.getInstalled(undefined, this.syncResource.profile.extensionsResource); + const installedExtensions = await this.extensionManagementService.getInstalled(undefined, this.profile.location); const ignoredExtensions = this.ignoredExtensionsManagementService.getIgnoredExtensions(installedExtensions); const remoteExtensions = resourcePreview.remoteContent ? JSON.parse(resourcePreview.remoteContent) : null; if (remoteExtensions !== null) { @@ -287,7 +287,7 @@ export class ExtensionsSynchroniser extends AbstractSynchroniser implements IUse if (localChange !== Change.None) { await this.backupLocal(JSON.stringify(localExtensions)); - skippedExtensions = await this.localExtensionsProvider.updateLocalExtensions(local.added, local.removed, local.updated, skippedExtensions, this.syncResource.profile); + skippedExtensions = await this.localExtensionsProvider.updateLocalExtensions(local.added, local.removed, local.updated, skippedExtensions, this.profile); } if (remote) { @@ -325,7 +325,7 @@ export class ExtensionsSynchroniser extends AbstractSynchroniser implements IUse async hasLocalData(): Promise { try { - const { localExtensions } = await this.localExtensionsProvider.getLocalExtensions(this.syncResource.profile); + const { localExtensions } = await this.localExtensionsProvider.getLocalExtensions(this.profile); if (localExtensions.some(e => e.installed || e.disabled)) { return true; } diff --git a/src/vs/platform/userDataSync/common/userDataProfilesManifestSync.ts b/src/vs/platform/userDataSync/common/userDataProfilesManifestSync.ts index 8be70621bfd..4d3767d988d 100644 --- a/src/vs/platform/userDataSync/common/userDataProfilesManifestSync.ts +++ b/src/vs/platform/userDataSync/common/userDataProfilesManifestSync.ts @@ -180,27 +180,15 @@ export class UserDataProfilesManifestSynchroniser extends AbstractSynchroniser i await this.backupLocal(stringifyLocalProfiles(this.getLocalUserDataProfiles(), false)); const promises: Promise[] = []; for (const profile of local.added) { - promises.push((async () => { - this.logService.trace(`${this.syncResourceLogLabel}: Creating '${profile.name}' profile...`); - await this.userDataProfilesService.createProfile(profile.id, profile.name, { shortName: profile.shortName }); - this.logService.info(`${this.syncResourceLogLabel}: Created profile '${profile.name}'.`); - })()); + promises.push(this.userDataProfilesService.createProfile(profile.id, profile.name, { shortName: profile.shortName })); } for (const profile of local.removed) { - promises.push((async () => { - this.logService.trace(`${this.syncResourceLogLabel}: Removing '${profile.name}' profile...`); - await this.userDataProfilesService.removeProfile(profile); - this.logService.info(`${this.syncResourceLogLabel}: Removed profile '${profile.name}'.`); - })()); + promises.push(this.userDataProfilesService.removeProfile(profile)); } for (const profile of local.updated) { const localProfile = this.userDataProfilesService.profiles.find(p => p.id === profile.id); if (localProfile) { - promises.push((async () => { - this.logService.trace(`${this.syncResourceLogLabel}: Updating '${profile.name}' profile...`); - await this.userDataProfilesService.updateProfile(localProfile, { name: profile.name, shortName: profile.shortName }); - this.logService.info(`${this.syncResourceLogLabel}: Updated profile '${profile.name}'.`); - })()); + promises.push(this.userDataProfilesService.updateProfile(localProfile, { name: profile.name, shortName: profile.shortName })); } else { this.logService.info(`${this.syncResourceLogLabel}: Could not find profile with id '${profile.id}' to update.`); } diff --git a/src/vs/platform/userDataSync/common/userDataSyncService.ts b/src/vs/platform/userDataSync/common/userDataSyncService.ts index 2741e974dd2..ab5261c5cc3 100644 --- a/src/vs/platform/userDataSync/common/userDataSyncService.ts +++ b/src/vs/platform/userDataSync/common/userDataSyncService.ts @@ -542,6 +542,19 @@ class ProfileSynchronizer extends Disposable { @IEnvironmentService private readonly environmentService: IEnvironmentService, ) { super(); + if (this._profile.isDefault) { + this._register(userDataProfilesService.onDidChangeProfiles(() => { + if ((userDataProfilesService.defaultProfile.extensionsResource && !this._profile.extensionsResource) || + (!userDataProfilesService.defaultProfile.extensionsResource && this._profile.extensionsResource)) { + this._profile = userDataProfilesService.defaultProfile; + for (const [synchronizer] of this._enabled) { + if (synchronizer instanceof ExtensionsSynchroniser) { + synchronizer.profile = this._profile; + } + } + } + })); + } this._register(userDataSyncEnablementService.onDidChangeResourceEnablement(([syncResource, enablement]) => this.onDidChangeResourceEnablement(syncResource, enablement))); this._register(toDisposable(() => this._enabled.splice(0, this._enabled.length).forEach(([, , disposable]) => disposable.dispose()))); for (const syncResource of ALL_SYNC_RESOURCES) { diff --git a/src/vs/server/node/remoteAgentEnvironmentImpl.ts b/src/vs/server/node/remoteAgentEnvironmentImpl.ts index f16217b0125..7f581f36ea5 100644 --- a/src/vs/server/node/remoteAgentEnvironmentImpl.ts +++ b/src/vs/server/node/remoteAgentEnvironmentImpl.ts @@ -29,7 +29,6 @@ import { IExtensionsScannerService, toExtensionDescription } from 'vs/platform/e import { dedupExtensions } from 'vs/workbench/services/extensions/common/extensionsUtil'; import { IUserDataProfilesService } from 'vs/platform/userDataProfile/common/userDataProfile'; import { ExtensionManagementCLI } from 'vs/platform/extensionManagement/common/extensionManagementCLI'; -import { INativeServerExtensionManagementService } from 'vs/platform/extensionManagement/node/extensionManagementService'; export class RemoteAgentEnvironmentChannel implements IServerChannel { @@ -45,7 +44,6 @@ export class RemoteAgentEnvironmentChannel implements IServerChannel { private readonly _logService: ILogService, private readonly _extensionHostStatusService: IExtensionHostStatusService, private readonly _extensionsScannerService: IExtensionsScannerService, - private readonly _extensionManagementService: INativeServerExtensionManagementService, ) { if (_environmentService.args['install-builtin-extension']) { const installOptions: InstallOptions = { isMachineScoped: !!_environmentService.args['do-not-sync'], installPreReleaseVersion: !!_environmentService.args['pre-release'] }; @@ -336,7 +334,6 @@ export class RemoteAgentEnvironmentChannel implements IServerChannel { } private async _scanInstalledExtensions(language: string): Promise { - await this._extensionManagementService.migrateDefaultProfileExtensions(); const scannedExtensions = await this._extensionsScannerService.scanUserExtensions({ language, useCache: true }); return scannedExtensions.map(e => toExtensionDescription(e, false)); } diff --git a/src/vs/server/node/serverServices.ts b/src/vs/server/node/serverServices.ts index 9d94002e098..6978f8f6e4f 100644 --- a/src/vs/server/node/serverServices.ts +++ b/src/vs/server/node/serverServices.ts @@ -196,7 +196,7 @@ export async function setupServerServices(connectionToken: ServerConnectionToken instantiationService.invokeFunction(accessor => { const extensionManagementService = accessor.get(INativeServerExtensionManagementService); const extensionsScannerService = accessor.get(IExtensionsScannerService); - const remoteExtensionEnvironmentChannel = new RemoteAgentEnvironmentChannel(connectionToken, environmentService, userDataProfilesService, instantiationService.createInstance(ExtensionManagementCLI), logService, extensionHostStatusService, extensionsScannerService, extensionManagementService); + const remoteExtensionEnvironmentChannel = new RemoteAgentEnvironmentChannel(connectionToken, environmentService, userDataProfilesService, instantiationService.createInstance(ExtensionManagementCLI), logService, extensionHostStatusService, extensionsScannerService); socketServer.registerChannel('remoteextensionsenvironment', remoteExtensionEnvironmentChannel); const telemetryChannel = new ServerTelemetryChannel(accessor.get(IServerTelemetryService), oneDsAppender); @@ -219,7 +219,7 @@ export async function setupServerServices(connectionToken: ServerConnectionToken socketServer.registerChannel('credentials', credentialsChannel); // clean up deprecated extensions - extensionManagementService.removeUninstalledExtensions(); + extensionManagementService.removeUninstalledExtensions(true); disposables.add(new ErrorTelemetry(accessor.get(ITelemetryService))); diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts b/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts index 7c0e6f44ab8..3569cdb1657 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts @@ -2501,7 +2501,6 @@ export class ReinstallAction extends Action { constructor( id: string = ReinstallAction.ID, label: string = ReinstallAction.LABEL, @IExtensionsWorkbenchService private readonly extensionsWorkbenchService: IExtensionsWorkbenchService, - @IExtensionManagementServerService private readonly extensionManagementServerService: IExtensionManagementServerService, @IQuickInputService private readonly quickInputService: IQuickInputService, @INotificationService private readonly notificationService: INotificationService, @IHostService private readonly hostService: IHostService, @@ -2524,7 +2523,7 @@ export class ReinstallAction extends Action { return this.extensionsWorkbenchService.queryLocal() .then(local => { const entries = local - .filter(extension => !extension.isBuiltin && extension.server !== this.extensionManagementServerService.webExtensionManagementServer) + .filter(extension => !extension.isBuiltin) .map(extension => { return { id: extension.identifier.id, diff --git a/src/vs/workbench/services/extensionManagement/browser/webExtensionsScannerService.ts b/src/vs/workbench/services/extensionManagement/browser/webExtensionsScannerService.ts index abf7fbbcd96..905f49db4de 100644 --- a/src/vs/workbench/services/extensionManagement/browser/webExtensionsScannerService.ts +++ b/src/vs/workbench/services/extensionManagement/browser/webExtensionsScannerService.ts @@ -371,7 +371,7 @@ export class WebExtensionsScannerService extends Disposable implements IWebExten return this.readSystemExtensions(); } - async scanUserExtensions(profileLocation: URI, scanOptions?: ScanOptions): Promise { + async scanUserExtensions(profileLocation?: URI, scanOptions?: ScanOptions): Promise { const extensions = new Map(); // Custom builtin extensions defined through `additionalBuiltinExtensions` API @@ -410,7 +410,7 @@ export class WebExtensionsScannerService extends Disposable implements IWebExten return result; } - async scanExistingExtension(extensionLocation: URI, extensionType: ExtensionType, profileLocation: URI): Promise { + async scanExistingExtension(extensionLocation: URI, extensionType: ExtensionType, profileLocation?: URI): Promise { if (extensionType === ExtensionType.System) { const systemExtensions = await this.scanSystemExtensions(); return systemExtensions.find(e => e.location.toString() === extensionLocation.toString()) || null; @@ -419,7 +419,7 @@ export class WebExtensionsScannerService extends Disposable implements IWebExten return userExtensions.find(e => e.location.toString() === extensionLocation.toString()) || null; } - async scanMetadata(extensionLocation: URI, profileLocation: URI): Promise { + async scanMetadata(extensionLocation: URI, profileLocation?: URI): Promise { const extension = await this.scanExistingExtension(extensionLocation, ExtensionType.User, profileLocation); return extension?.metadata; } @@ -437,19 +437,19 @@ export class WebExtensionsScannerService extends Disposable implements IWebExten return null; } - async addExtensionFromGallery(galleryExtension: IGalleryExtension, metadata: Metadata, profileLocation: URI): Promise { + async addExtensionFromGallery(galleryExtension: IGalleryExtension, metadata: Metadata, profileLocation?: URI): Promise { const webExtension = await this.toWebExtensionFromGallery(galleryExtension, metadata); return this.addWebExtension(webExtension, profileLocation); } - async addExtension(location: URI, metadata: Metadata, profileLocation: URI): Promise { + async addExtension(location: URI, metadata: Metadata, profileLocation?: URI): Promise { const webExtension = await this.toWebExtension(location, undefined, undefined, undefined, undefined, undefined, undefined, metadata); const extension = await this.toScannedExtension(webExtension, false); await this.addToInstalledExtensions([webExtension], profileLocation); return extension; } - async removeExtension(extension: IScannedExtension, profileLocation: URI): Promise { + async removeExtension(extension: IScannedExtension, profileLocation?: URI): Promise { await this.writeInstalledExtensions(profileLocation, installedExtensions => installedExtensions.filter(installedExtension => !areSameExtensions(installedExtension.identifier, extension.identifier))); } @@ -467,7 +467,7 @@ export class WebExtensionsScannerService extends Disposable implements IWebExten } } - private async addWebExtension(webExtension: IWebExtension, profileLocation: URI): Promise { + private async addWebExtension(webExtension: IWebExtension, profileLocation?: URI): Promise { const isSystem = !!(await this.scanSystemExtensions()).find(e => areSameExtensions(e.identifier, webExtension.identifier)); const isBuiltin = !!webExtension.metadata?.isBuiltin; const extension = await this.toScannedExtension(webExtension, isBuiltin); @@ -504,7 +504,7 @@ export class WebExtensionsScannerService extends Disposable implements IWebExten return extension; } - private async addToInstalledExtensions(webExtensions: IWebExtension[], profileLocation: URI): Promise { + private async addToInstalledExtensions(webExtensions: IWebExtension[], profileLocation?: URI): Promise { await this.writeInstalledExtensions(profileLocation, installedExtensions => { // Remove the existing extension to avoid duplicates installedExtensions = installedExtensions.filter(installedExtension => webExtensions.some(extension => !areSameExtensions(installedExtension.identifier, extension.identifier))); @@ -513,11 +513,11 @@ export class WebExtensionsScannerService extends Disposable implements IWebExten }); } - private async scanInstalledExtensions(profileLocation: URI, scanOptions?: ScanOptions): Promise { + private async scanInstalledExtensions(profileLocation?: URI, scanOptions?: ScanOptions): Promise { let installedExtensions = await this.readInstalledExtensions(profileLocation); // If current profile is not a default profile, then add the application extensions to the list - if (!this.uriIdentityService.extUri.isEqual(profileLocation, this.userDataProfilesService.defaultProfile.extensionsResource)) { + if (this.userDataProfilesService.defaultProfile.extensionsResource && !this.uriIdentityService.extUri.isEqual(profileLocation, this.userDataProfilesService.defaultProfile.extensionsResource)) { // Remove application extensions from the non default profile installedExtensions = installedExtensions.filter(i => !i.metadata?.isApplicationScoped); // Add application extensions from the default profile to the list @@ -764,14 +764,14 @@ export class WebExtensionsScannerService extends Disposable implements IWebExten return this._migratePackageNLSUrisPromise; } - private async readInstalledExtensions(profileLocation: URI): Promise { + private async readInstalledExtensions(profileLocation?: URI): Promise { if (this.uriIdentityService.extUri.isEqual(profileLocation, this.userDataProfilesService.defaultProfile.extensionsResource)) { await this.migratePackageNLSUris(); } return this.withWebExtensions(profileLocation); } - private writeInstalledExtensions(profileLocation: URI, updateFn: (extensions: IWebExtension[]) => IWebExtension[]): Promise { + private writeInstalledExtensions(profileLocation: URI | undefined, updateFn: (extensions: IWebExtension[]) => IWebExtension[]): Promise { return this.withWebExtensions(profileLocation, updateFn); } diff --git a/src/vs/workbench/services/extensionManagement/common/extensionManagement.ts b/src/vs/workbench/services/extensionManagement/common/extensionManagement.ts index aecd0f677db..34d4367b525 100644 --- a/src/vs/workbench/services/extensionManagement/common/extensionManagement.ts +++ b/src/vs/workbench/services/extensionManagement/common/extensionManagement.ts @@ -167,15 +167,15 @@ export interface IWebExtensionsScannerService { readonly _serviceBrand: undefined; scanSystemExtensions(): Promise; - scanUserExtensions(profileLocation: URI, options?: ScanOptions): Promise; + scanUserExtensions(profileLocation: URI | undefined, options?: ScanOptions): Promise; scanExtensionsUnderDevelopment(): Promise; - scanExistingExtension(extensionLocation: URI, extensionType: ExtensionType, profileLocation: URI): Promise; + scanExistingExtension(extensionLocation: URI, extensionType: ExtensionType, profileLocation: URI | undefined): Promise; - addExtension(location: URI, metadata: Metadata, profileLocation: URI): Promise; - addExtensionFromGallery(galleryExtension: IGalleryExtension, metadata: Metadata, profileLocation: URI): Promise; - removeExtension(extension: IScannedExtension, profileLocation: URI): Promise; + addExtension(location: URI, metadata: Metadata, profileLocation: URI | undefined): Promise; + addExtensionFromGallery(galleryExtension: IGalleryExtension, metadata: Metadata, profileLocation: URI | undefined): Promise; + removeExtension(extension: IScannedExtension, profileLocation: URI | undefined): Promise; copyExtensions(fromProfileLocation: URI, toProfileLocation: URI, filter: (extension: IScannedExtension) => boolean): Promise; - scanMetadata(extensionLocation: URI, profileLocation: URI): Promise; + scanMetadata(extensionLocation: URI, profileLocation: URI | undefined): Promise; scanExtensionManifest(extensionLocation: URI): Promise; } diff --git a/src/vs/workbench/services/extensionManagement/common/webExtensionManagementService.ts b/src/vs/workbench/services/extensionManagement/common/webExtensionManagementService.ts index 0deec1d3631..79333395143 100644 --- a/src/vs/workbench/services/extensionManagement/common/webExtensionManagementService.ts +++ b/src/vs/workbench/services/extensionManagement/common/webExtensionManagementService.ts @@ -4,14 +4,14 @@ *--------------------------------------------------------------------------------------------*/ import { ExtensionIdentifier, ExtensionType, IExtension, IExtensionIdentifier, IExtensionManifest, TargetPlatform } from 'vs/platform/extensions/common/extensions'; -import { ILocalExtension, IGalleryExtension, IGalleryMetadata, InstallOperation, IExtensionGalleryService, Metadata, InstallOptions } from 'vs/platform/extensionManagement/common/extensionManagement'; +import { ILocalExtension, IGalleryExtension, IGalleryMetadata, InstallOperation, IExtensionGalleryService, Metadata, InstallOptions, UninstallOptions } from 'vs/platform/extensionManagement/common/extensionManagement'; import { URI } from 'vs/base/common/uri'; import { Emitter, Event } from 'vs/base/common/event'; import { areSameExtensions, getGalleryExtensionId } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { IProfileAwareExtensionManagementService, IScannedExtension, IWebExtensionsScannerService } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; import { ILogService } from 'vs/platform/log/common/log'; import { CancellationToken } from 'vs/base/common/cancellation'; -import { AbstractExtensionManagementService, AbstractExtensionTask, IInstallExtensionTask, InstallExtensionTaskOptions, IUninstallExtensionTask, UninstallExtensionTaskOptions } from 'vs/platform/extensionManagement/common/abstractExtensionManagementService'; +import { AbstractExtensionManagementService, AbstractExtensionTask, IInstallExtensionTask, IUninstallExtensionTask } from 'vs/platform/extensionManagement/common/abstractExtensionManagementService'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IExtensionManifestPropertiesService } from 'vs/workbench/services/extensions/common/extensionManifestPropertiesService'; import { IProductService } from 'vs/platform/product/common/productService'; @@ -129,11 +129,17 @@ export class WebExtensionManagementService extends AbstractExtensionManagementSe return local; } - protected createInstallExtensionTask(manifest: IExtensionManifest, extension: URI | IGalleryExtension, options: InstallExtensionTaskOptions): IInstallExtensionTask { + protected doCreateInstallExtensionTask(manifest: IExtensionManifest, extension: URI | IGalleryExtension, options: InstallOptions): IInstallExtensionTask { + if (!options.profileLocation) { + options = { ...options, profileLocation: this.userDataProfileService.currentProfile.extensionsResource }; + } return new InstallExtensionTask(manifest, extension, options, this.webExtensionsScannerService); } - protected createUninstallExtensionTask(extension: ILocalExtension, options: UninstallExtensionTaskOptions): IUninstallExtensionTask { + protected doCreateUninstallExtensionTask(extension: ILocalExtension, options: UninstallOptions): IUninstallExtensionTask { + if (!options.profileLocation) { + options = { ...options, profileLocation: this.userDataProfileService.currentProfile.extensionsResource }; + } return new UninstallExtensionTask(extension, options, this.webExtensionsScannerService); } @@ -142,7 +148,6 @@ export class WebExtensionManagementService extends AbstractExtensionManagementSe getManifest(vsix: URI): Promise { throw new Error('unsupported'); } updateExtensionScope(): Promise { throw new Error('unsupported'); } download(): Promise { throw new Error('unsupported'); } - reinstallFromGallery(): Promise { throw new Error('unsupported'); } private async whenProfileChanged(e: DidChangeUserDataProfileEvent): Promise { const previousProfileLocation = e.previous.extensionsResource; @@ -197,7 +202,7 @@ class InstallExtensionTask extends AbstractExtensionTask<{ local: ILocalExtensio constructor( manifest: IExtensionManifest, private readonly extension: URI | IGalleryExtension, - private readonly options: InstallExtensionTaskOptions, + private readonly options: InstallOptions, private readonly webExtensionsScannerService: IWebExtensionsScannerService, ) { super(); @@ -238,7 +243,7 @@ class UninstallExtensionTask extends AbstractExtensionTask implements IUni constructor( readonly extension: ILocalExtension, - private readonly options: UninstallExtensionTaskOptions, + private readonly options: UninstallOptions, private readonly webExtensionsScannerService: IWebExtensionsScannerService, ) { super(); diff --git a/src/vs/workbench/services/extensionManagement/electron-sandbox/nativeExtensionManagementService.ts b/src/vs/workbench/services/extensionManagement/electron-sandbox/nativeExtensionManagementService.ts index 6d2bf5f714b..da1f95ec42e 100644 --- a/src/vs/workbench/services/extensionManagement/electron-sandbox/nativeExtensionManagementService.ts +++ b/src/vs/workbench/services/extensionManagement/electron-sandbox/nativeExtensionManagementService.ts @@ -15,6 +15,7 @@ import { delta } from 'vs/base/common/arrays'; import { compare } from 'vs/base/common/strings'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { DidChangeUserDataProfileEvent, IUserDataProfileService } from 'vs/workbench/services/userDataProfile/common/userDataProfile'; +import { EXTENSIONS_RESOURCE_NAME } from 'vs/platform/userDataProfile/common/userDataProfile'; import { joinPath } from 'vs/base/common/resources'; import { IExtensionsProfileScannerService } from 'vs/platform/extensionManagement/common/extensionsProfileScannerService'; import { Schemas } from 'vs/base/common/network'; @@ -105,7 +106,8 @@ export class NativeExtensionManagementService extends ExtensionManagementChannel } private async whenProfileChanged(e: DidChangeUserDataProfileEvent): Promise { - const oldExtensions = await super.getInstalled(ExtensionType.User, e.previous.extensionsResource); + const previousExtensionsResource = e.previous.extensionsResource ?? joinPath(e.previous.location, EXTENSIONS_RESOURCE_NAME); + const oldExtensions = await super.getInstalled(ExtensionType.User, previousExtensionsResource); if (e.preserveData) { const extensions: [ILocalExtension, Metadata | undefined][] = await Promise.all(oldExtensions .filter(e => !e.isApplicationScoped) /* remove application scoped extensions */ diff --git a/src/vs/workbench/services/extensions/electron-sandbox/cachedExtensionScanner.ts b/src/vs/workbench/services/extensions/electron-sandbox/cachedExtensionScanner.ts index b2a8611aec9..dd9be154068 100644 --- a/src/vs/workbench/services/extensions/electron-sandbox/cachedExtensionScanner.ts +++ b/src/vs/workbench/services/extensions/electron-sandbox/cachedExtensionScanner.ts @@ -16,9 +16,6 @@ import { INotificationService } from 'vs/platform/notification/common/notificati import { IHostService } from 'vs/workbench/services/host/browser/host'; import { timeout } from 'vs/base/common/async'; import { IUserDataProfileService } from 'vs/workbench/services/userDataProfile/common/userDataProfile'; -import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; -import { DEFAULT_PROFILE_EXTENSIONS_MIGRATION_KEY } from 'vs/platform/extensionManagement/common/extensionManagement'; -import { IUserDataProfilesService } from 'vs/platform/userDataProfile/common/userDataProfile'; export class CachedExtensionScanner { @@ -31,8 +28,6 @@ export class CachedExtensionScanner { @IHostService private readonly _hostService: IHostService, @IExtensionsScannerService private readonly _extensionsScannerService: IExtensionsScannerService, @IUserDataProfileService private readonly _userDataProfileService: IUserDataProfileService, - @IUserDataProfilesService private readonly _userDataProfilesService: IUserDataProfilesService, - @IStorageService private readonly _storageService: IStorageService, @ILogService private readonly _logService: ILogService, ) { this.scannedExtensions = new Promise((resolve, reject) => { @@ -58,10 +53,9 @@ export class CachedExtensionScanner { private async _scanInstalledExtensions(): Promise { try { const language = platform.language; - const profileLocation = this._userDataProfilesService.profiles.length === 1 && this._userDataProfileService.currentProfile.isDefault && !this._storageService.getBoolean(DEFAULT_PROFILE_EXTENSIONS_MIGRATION_KEY, StorageScope.APPLICATION, false) ? undefined : this._userDataProfileService.currentProfile.extensionsResource; const [scannedSystemExtensions, scannedUserExtensions] = await Promise.all([ this._extensionsScannerService.scanSystemExtensions({ language, useCache: true, checkControlFile: true }), - this._extensionsScannerService.scanUserExtensions({ language, profileLocation, useCache: true })]); + this._extensionsScannerService.scanUserExtensions({ language, profileLocation: this._userDataProfileService.currentProfile.extensionsResource, useCache: true })]); const scannedDevelopedExtensions = await this._extensionsScannerService.scanExtensionsUnderDevelopment({ language }, [...scannedSystemExtensions, ...scannedUserExtensions]); const system = scannedSystemExtensions.map(e => toExtensionDescription(e, false)); const user = scannedUserExtensions.map(e => toExtensionDescription(e, false)); diff --git a/src/vs/workbench/services/userDataProfile/common/userDataProfileService.ts b/src/vs/workbench/services/userDataProfile/common/userDataProfileService.ts index 2f2f2c8a1fc..63b78ba06b7 100644 --- a/src/vs/workbench/services/userDataProfile/common/userDataProfileService.ts +++ b/src/vs/workbench/services/userDataProfile/common/userDataProfileService.ts @@ -34,6 +34,15 @@ export class UserDataProfileService extends Disposable implements IUserDataProfi super(); this._currentProfile = currentProfile; this._register(userDataProfilesService.onDidChangeProfiles(e => { + /** + * If the current profile is default profile, then reset it because, + * In Desktop the extensions resource will be set/unset in the default profile when profiles are changed. + */ + if (this._currentProfile.isDefault) { + this._currentProfile = userDataProfilesService.defaultProfile; + return; + } + const updatedCurrentProfile = e.updated.find(p => this._currentProfile.id === p.id); if (updatedCurrentProfile) { this._currentProfile = updatedCurrentProfile; diff --git a/src/vs/workbench/test/electron-browser/workbenchTestServices.ts b/src/vs/workbench/test/electron-browser/workbenchTestServices.ts index 4b09620745a..ebec1acd03c 100644 --- a/src/vs/workbench/test/electron-browser/workbenchTestServices.ts +++ b/src/vs/workbench/test/electron-browser/workbenchTestServices.ts @@ -68,7 +68,7 @@ const NULL_PROFILE = { keybindingsResource: joinPath(URI.file(homeDir), 'keybindings.json'), tasksResource: joinPath(URI.file(homeDir), 'tasks.json'), snippetsHome: joinPath(URI.file(homeDir), 'snippets'), - extensionsResource: joinPath(URI.file(homeDir), 'extensions.json') + extensionsResource: undefined }; export const TestNativeWindowConfiguration: INativeWindowConfiguration = { From c55ef92fed700340ddc58a22c9101537a42465b6 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 2 Nov 2022 19:23:14 -0700 Subject: [PATCH 066/185] Reduce usage of invalid property overrides (#165293) With native property fields, a few of our properties are no longer valid. This either removes them or switches them to use declare instead --- src/vs/base/browser/ui/tree/asyncDataTree.ts | 2 +- src/vs/base/browser/ui/tree/dataTree.ts | 2 +- src/vs/base/browser/ui/tree/indexTree.ts | 2 +- src/vs/base/browser/ui/tree/objectTree.ts | 4 ++-- .../electron-sandbox/extensionTipsService.ts | 2 -- src/vs/platform/list/browser/listService.ts | 4 ++-- src/vs/workbench/browser/web.main.ts | 2 +- src/vs/workbench/contrib/tasks/common/tasks.ts | 6 +++--- .../electron-sandbox/extensionTipsService.ts | 2 -- 9 files changed, 11 insertions(+), 15 deletions(-) diff --git a/src/vs/base/browser/ui/tree/asyncDataTree.ts b/src/vs/base/browser/ui/tree/asyncDataTree.ts index a8b84679303..63d1d9e0113 100644 --- a/src/vs/base/browser/ui/tree/asyncDataTree.ts +++ b/src/vs/base/browser/ui/tree/asyncDataTree.ts @@ -1150,7 +1150,7 @@ export interface ICompressibleAsyncDataTreeOptionsUpdate extends IAsyncDataTreeO export class CompressibleAsyncDataTree extends AsyncDataTree { - protected override readonly tree!: CompressibleObjectTree, TFilterData>; + protected declare readonly tree: CompressibleObjectTree, TFilterData>; protected readonly compressibleNodeMapper: CompressibleAsyncDataTreeNodeMapper = new WeakMapper(node => new CompressibleAsyncDataTreeNodeWrapper(node)); private filter?: ITreeFilter; diff --git a/src/vs/base/browser/ui/tree/dataTree.ts b/src/vs/base/browser/ui/tree/dataTree.ts index 4dfe854ec04..06b8e2339ec 100644 --- a/src/vs/base/browser/ui/tree/dataTree.ts +++ b/src/vs/base/browser/ui/tree/dataTree.ts @@ -16,7 +16,7 @@ export interface IDataTreeOptions extends IAbstractTreeOp export class DataTree extends AbstractTree { - protected override model!: ObjectTreeModel; + protected declare model: ObjectTreeModel; private input: TInput | undefined; private identityProvider: IIdentityProvider | undefined; diff --git a/src/vs/base/browser/ui/tree/indexTree.ts b/src/vs/base/browser/ui/tree/indexTree.ts index 38a141fe88b..cf86858ca51 100644 --- a/src/vs/base/browser/ui/tree/indexTree.ts +++ b/src/vs/base/browser/ui/tree/indexTree.ts @@ -14,7 +14,7 @@ export interface IIndexTreeOptions extends IAbstractTreeO export class IndexTree extends AbstractTree { - protected override model!: IndexTreeModel; + protected declare model: IndexTreeModel; constructor( user: string, diff --git a/src/vs/base/browser/ui/tree/objectTree.ts b/src/vs/base/browser/ui/tree/objectTree.ts index bd4aa34b2c7..c6be2d0f4ff 100644 --- a/src/vs/base/browser/ui/tree/objectTree.ts +++ b/src/vs/base/browser/ui/tree/objectTree.ts @@ -45,7 +45,7 @@ export interface IObjectTreeViewState { export class ObjectTree, TFilterData = void> extends AbstractTree { - protected override model!: IObjectTreeModel; + protected declare model: IObjectTreeModel; override get onDidChangeCollapseState(): Event> { return this.model.onDidChangeCollapseState; } @@ -197,7 +197,7 @@ export interface ICompressibleObjectTreeOptionsUpdate extends IAbstractTreeOptio export class CompressibleObjectTree, TFilterData = void> extends ObjectTree implements ICompressedTreeNodeProvider { - protected override model!: CompressibleObjectTreeModel; + protected declare model: CompressibleObjectTreeModel; constructor( user: string, diff --git a/src/vs/platform/extensionManagement/electron-sandbox/extensionTipsService.ts b/src/vs/platform/extensionManagement/electron-sandbox/extensionTipsService.ts index fdfb6721b9a..a5f8f0a7972 100644 --- a/src/vs/platform/extensionManagement/electron-sandbox/extensionTipsService.ts +++ b/src/vs/platform/extensionManagement/electron-sandbox/extensionTipsService.ts @@ -44,8 +44,6 @@ const lastPromptedMediumImpExeTimeStorageKey = 'extensionTips/lastPromptedMedium export class ExtensionTipsService extends BaseExtensionTipsService { - override _serviceBrand: any; - private readonly highImportanceExecutableTips: Map = new Map(); private readonly mediumImportanceExecutableTips: Map = new Map(); private readonly allOtherExecutableTips: Map = new Map(); diff --git a/src/vs/platform/list/browser/listService.ts b/src/vs/platform/list/browser/listService.ts index 5fb143fc948..180b544463f 100644 --- a/src/vs/platform/list/browser/listService.ts +++ b/src/vs/platform/list/browser/listService.ts @@ -782,7 +782,7 @@ class ListResourceNavigator extends ResourceNavigator { class TableResourceNavigator extends ResourceNavigator { - protected override readonly widget!: Table; + protected declare readonly widget: Table; constructor( widget: Table, @@ -798,7 +798,7 @@ class TableResourceNavigator extends ResourceNavigator { class TreeResourceNavigator extends ResourceNavigator { - protected override readonly widget!: ObjectTree | CompressibleObjectTree | DataTree | AsyncDataTree | CompressibleAsyncDataTree; + protected declare readonly widget: ObjectTree | CompressibleObjectTree | DataTree | AsyncDataTree | CompressibleAsyncDataTree; constructor( widget: ObjectTree | CompressibleObjectTree | DataTree | AsyncDataTree | CompressibleAsyncDataTree, diff --git a/src/vs/workbench/browser/web.main.ts b/src/vs/workbench/browser/web.main.ts index f1172f35667..da874609806 100644 --- a/src/vs/workbench/browser/web.main.ts +++ b/src/vs/workbench/browser/web.main.ts @@ -197,7 +197,7 @@ export class BrowserMain extends Disposable { } return new class extends DisposableTunnel implements ITunnel { - override localAddress!: string; + declare localAddress: string; }({ port: tunnel.tunnelRemotePort, host: tunnel.tunnelRemoteHost }, tunnel.localAddress, () => tunnel.dispose()); } }, diff --git a/src/vs/workbench/contrib/tasks/common/tasks.ts b/src/vs/workbench/contrib/tasks/common/tasks.ts index b6a5922064e..c53dd0ea644 100644 --- a/src/vs/workbench/contrib/tasks/common/tasks.ts +++ b/src/vs/workbench/contrib/tasks/common/tasks.ts @@ -701,7 +701,7 @@ export abstract class CommonTask { */ export class CustomTask extends CommonTask { - override type!: '$customized'; // CUSTOMIZED_TASK_TYPE + declare type: '$customized'; // CUSTOMIZED_TASK_TYPE instance: number | undefined; @@ -903,7 +903,7 @@ export class ContributedTask extends CommonTask { * Indicated the source of the task (e.g. tasks.json or extension) * Set in the super constructor */ - override _source!: IExtensionTaskSource; + declare _source: IExtensionTaskSource; instance: number | undefined; @@ -997,7 +997,7 @@ export class InMemoryTask extends CommonTask { instance: number | undefined; - override type!: 'inMemory'; + declare type: 'inMemory'; public constructor(id: string, source: IInMemoryTaskSource, label: string, type: string, runOptions: IRunOptions, configurationProperties: IConfigurationProperties) { diff --git a/src/vs/workbench/services/extensionManagement/electron-sandbox/extensionTipsService.ts b/src/vs/workbench/services/extensionManagement/electron-sandbox/extensionTipsService.ts index fa12c6b9d13..b89795c0fe8 100644 --- a/src/vs/workbench/services/extensionManagement/electron-sandbox/extensionTipsService.ts +++ b/src/vs/workbench/services/extensionManagement/electron-sandbox/extensionTipsService.ts @@ -17,8 +17,6 @@ import { Schemas } from 'vs/base/common/network'; class NativeExtensionTipsService extends ExtensionTipsService implements IExtensionTipsService { - override _serviceBrand: any; - private readonly channel: IChannel; constructor( From f945df1b2de8b5894fdb7670331287f886ea869a Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 2 Nov 2022 19:23:58 -0700 Subject: [PATCH 067/185] Enable strict mode and bump target for test/smoke (#165296) --- .../src/areas/workbench/data-loss.test.ts | 8 +++---- test/smoke/src/utils.ts | 21 +------------------ test/smoke/tsconfig.json | 6 +++--- 3 files changed, 8 insertions(+), 27 deletions(-) diff --git a/test/smoke/src/areas/workbench/data-loss.test.ts b/test/smoke/src/areas/workbench/data-loss.test.ts index df19f673914..46af836e91c 100644 --- a/test/smoke/src/areas/workbench/data-loss.test.ts +++ b/test/smoke/src/areas/workbench/data-loss.test.ts @@ -71,18 +71,18 @@ export function setup(ensureStableCode: () => string | undefined, logger: Logger }); it('verifies that "hot exit" works for dirty files (without delay)', function () { - return testHotExit.call(this, 'test_verifies_that_hot_exit_works_for_dirty_files_without_delay', undefined); + return testHotExit.call(this, 'test_verifies_that_hot_exit_works_for_dirty_files_without_delay', undefined, undefined); }); it('verifies that "hot exit" works for dirty files (with delay)', function () { - return testHotExit.call(this, 'test_verifies_that_hot_exit_works_for_dirty_files_with_delay', 2000); + return testHotExit.call(this, 'test_verifies_that_hot_exit_works_for_dirty_files_with_delay', 2000, undefined); }); it('verifies that auto save triggers on shutdown', function () { return testHotExit.call(this, 'test_verifies_that_auto_save_triggers_on_shutdown', undefined, true); }); - async function testHotExit(title: string, restartDelay: number | undefined, autoSave: boolean | undefined) { + async function testHotExit(this: import('mocha').Context, title: string, restartDelay: number | undefined, autoSave: boolean | undefined) { app = createApp({ ...this.defaultOptions, logsPath: suiteLogsPath(this.defaultOptions, title), @@ -201,7 +201,7 @@ export function setup(ensureStableCode: () => string | undefined, logger: Logger return testHotExit.call(this, `test_verifies_that_hot_exit_works_for_dirty_files_with_delay_from_stable`, 2000); }); - async function testHotExit(title: string, restartDelay: number | undefined) { + async function testHotExit(this: import('mocha').Context, title: string, restartDelay: number | undefined) { const stableCodePath = ensureStableCode(); if (!stableCodePath) { this.skip(); diff --git a/test/smoke/src/utils.ts b/test/smoke/src/utils.ts index 5bbb4d21104..3d4912658e9 100644 --- a/test/smoke/src/utils.ts +++ b/test/smoke/src/utils.ts @@ -19,25 +19,6 @@ export function itRepeat(n: number, description: string, callback: (this: Contex } } -/** - * Defines a test-case that will run but will be skips it if it throws an exception. This is useful - * to get some runs in CI when trying to stabilize a flaky test, without failing the build. Note - * that this only works if something inside the test throws, so a test's overall timeout won't work - * but throwing due to a polling timeout will. - * @param title The test-case title. - * @param callback The test-case callback. - */ -export function itSkipOnFail(title: string, callback: (this: Context) => any): void { - it(title, function () { - return Promise.resolve().then(() => { - return callback.apply(this, arguments); - }).catch(e => { - console.warn(`Test "${title}" failed but was marked as skip on fail:`, e); - this.skip(); - }); - }); -} - export function installAllHandlers(logger: Logger, optionsTransform?: (opts: ApplicationOptions) => ApplicationOptions) { installDiagnosticsHandler(logger); installAppBeforeHandler(optionsTransform); @@ -195,7 +176,7 @@ export async function retry(task: ITask>, delay: number, retries: return await task(); } catch (error) { - lastError = error; + lastError = error as Error; await timeout(delay); } diff --git a/test/smoke/tsconfig.json b/test/smoke/tsconfig.json index 6f0b40e93e5..262769765a6 100644 --- a/test/smoke/tsconfig.json +++ b/test/smoke/tsconfig.json @@ -4,14 +4,14 @@ "noImplicitAny": false, "removeComments": false, "preserveConstEnums": true, - "target": "es2017", - "strictNullChecks": true, + "target": "es2020", + "strict": true, "noUnusedParameters": false, "noUnusedLocals": true, "outDir": "out", "sourceMap": true, "lib": [ - "es2016", + "es2020", "dom" ] }, From 86f0f9bfa268fe21af7efae37d8f0da1dba8137f Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Wed, 2 Nov 2022 19:25:43 -0700 Subject: [PATCH 068/185] Move notebook editor widget theme to css variables (#165300) --- .../interactive/browser/interactiveEditor.ts | 12 +- .../notebook/browser/media/notebook.css | 170 +++++++++++- .../browser/media/notebookFocusIndicator.css | 6 +- .../browser/media/notebookToolbar.css | 2 +- .../notebook/browser/notebookEditorWidget.ts | 245 +----------------- 5 files changed, 181 insertions(+), 254 deletions(-) diff --git a/src/vs/workbench/contrib/interactive/browser/interactiveEditor.ts b/src/vs/workbench/contrib/interactive/browser/interactiveEditor.ts index 10a6c6a0a47..c2476414c5b 100644 --- a/src/vs/workbench/contrib/interactive/browser/interactiveEditor.ts +++ b/src/vs/workbench/contrib/interactive/browser/interactiveEditor.ts @@ -222,24 +222,24 @@ export class InteractiveEditor extends EditorPane { if (focusIndicator === 'gutter') { styleSheets.push(` .interactive-editor .input-cell-container:focus-within .input-focus-indicator::before { - border-color: var(--notebook-focused-cell-border-color) !important; + border-color: var(--vscode-notebook-focusedCellBorder) !important; } .interactive-editor .input-focus-indicator::before { - border-color: var(--notebook-inactive-focused-cell-border-color) !important; + border-color: var(--vscode-notebook-inactiveFocusedCellBorder) !important; } .interactive-editor .input-cell-container .input-focus-indicator { display: block; top: ${INPUT_CELL_VERTICAL_PADDING}px; } .interactive-editor .input-cell-container { - border-top: 1px solid var(--notebook-inactive-focused-cell-border-color); + border-top: 1px solid var(--vscode-notebook-inactiveFocusedCellBorder); } `); } else { // border styleSheets.push(` .interactive-editor .input-cell-container { - border-top: 1px solid var(--notebook-inactive-focused-cell-border-color); + border-top: 1px solid var(--vscode-notebook-inactiveFocusedCellBorder); } .interactive-editor .input-cell-container .input-focus-indicator { display: none; @@ -687,10 +687,10 @@ export class InteractiveEditor extends EditorPane { registerThemingParticipant((theme, collector) => { collector.addRule(` .interactive-editor .input-cell-container:focus-within .input-editor-container .monaco-editor { - outline: solid 1px var(--notebook-focused-cell-border-color); + outline: solid 1px var(--vscode-notebook-focusedCellBorder); } .interactive-editor .input-cell-container .input-editor-container .monaco-editor { - outline: solid 1px var(--notebook-inactive-focused-cell-border-color); + outline: solid 1px var(--vscode-notebook-inactiveFocusedCellBorder); } .interactive-editor .input-cell-container .input-focus-indicator { top: ${INPUT_CELL_VERTICAL_PADDING}px; diff --git a/src/vs/workbench/contrib/notebook/browser/media/notebook.css b/src/vs/workbench/contrib/notebook/browser/media/notebook.css index 0a0c0c97b22..00f2ef7f363 100644 --- a/src/vs/workbench/contrib/notebook/browser/media/notebook.css +++ b/src/vs/workbench/contrib/notebook/browser/media/notebook.css @@ -252,11 +252,11 @@ } .monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .input-collapse-container .collapsed-execution-icon .codicon-notebook-state-success { - color: var(--notebook-cell-status-icon-success); + color: var(--vscode-notebookStatusSuccessIcon-foreground); } .monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .input-collapse-container .collapsed-execution-icon .codicon-notebook-state-error { - color: var(--notebook-cell-status-icon-error); + color: var(--vscode-notebookStatusErrorIcon-foreground); } .monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .input-collapse-container .cell-collapse-preview { @@ -569,3 +569,169 @@ .cell-comment-container.review-widget { background-color: var(--vscode-peekViewResult-background); } + +/** Cell output show more*/ +.notebookOverlay .output-show-more-container a, +.notebookOverlay div.output-show-more a { + color: var(--vscode-textLink-foreground); +} + +.notebookOverlay .output-show-more-container a:active, +.notebookOverlay .output-show-more a:active { + color: var(--vscode-textLink-activeForeground); +} + +/** Notebook cell output background */ +.notebookOverlay .output, +.notebookOverlay .output-element, +.notebookOverlay .output-show-more-container { + background-color: var(--vscode-notebook-outputContainerBackgroundColor); +} + +.notebookOverlay .output-element { + border-top: none !important; border: 1px solid transparent; border-color: var(--vscode-notebook-outputContainerBorderColor) !important; +} + +/** Notebook editor background */ +.notebookOverlay .cell-drag-image .cell-editor-container > div { + background: var(--vscode-editor-background) !important; +} +.notebookOverlay .monaco-list-row .cell-title-toolbar, +.notebookOverlay .monaco-list-row.cell-drag-image, +.notebookOverlay .cell-bottom-toolbar-container .action-item, +.notebookOverlay .cell-list-top-cell-toolbar-container .action-item { + background-color: var(--vscode-editor-background); +} + +.monaco-workbench .notebookOverlay.notebook-editor { + background-color: var(--vscode-notebook-editorBackground); +} + +.notebookOverlay .cell .monaco-editor-background, +.notebookOverlay .cell .margin-view-overlays, +.notebookOverlay .cell .cell-statusbar-container { + background: var(--vscode-notebook-cellEditorBackground, var(--vscode-editor-background)); +} + +/** Cell toolbar separator */ + +.notebookOverlay .monaco-list-row .cell-title-toolbar, +.notebookOverlay .cell-bottom-toolbar-container .action-item, +.notebookOverlay .cell-list-top-cell-toolbar-container .action-item { + border: solid 1px var(--vscode-notebook-cellToolbarSeparator); +} +.notebookOverlay .monaco-action-bar .action-item.verticalSeparator { + background-color: var(--vscode-notebook-cellToolbarSeparator); +} +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .input-collapse-container { + border-bottom: solid 1px var(--vscode-notebook-cellToolbarSeparator); +} + +/** Focused cell background */ + +.notebookOverlay .code-cell-row.focused .cell-focus-indicator, +.notebookOverlay .markdown-cell-row.focused, +.notebookOverlay .code-cell-row.focused .input-collapse-container { + background-color: var(--vscode-notebook-focusedCellBackground) !important; +} + +/** Selected cell background */ +.notebookOverlay .monaco-list.selection-multiple .markdown-cell-row.selected, +.notebookOverlay .monaco-list.selection-multiple .code-cell-row.selected .cell-focus-indicator-top, +.notebookOverlay .monaco-list.selection-multiple .code-cell-row.selected .cell-focus-indicator-left, +.notebookOverlay .monaco-list.selection-multiple .code-cell-row.selected .cell-focus-indicator-right, +.notebookOverlay .monaco-list.selection-multiple .code-cell-row.selected .cell-focus-indicator-bottom { + background-color: var(--vscode-notebook-selectedCellBackground, inherit) !important; +} + +.notebookOverlay .monaco-list.selection-multiple:focus-within .monaco-list-row.selected .cell-focus-indicator-top:before, +.notebookOverlay .monaco-list.selection-multiple:focus-within .monaco-list-row.selected .cell-focus-indicator-bottom:before, +.notebookOverlay .monaco-list.selection-multiple:focus-within .monaco-list-row.selected .cell-inner-container:not(.cell-editor-focus) .cell-focus-indicator-left:before, +.notebookOverlay .monaco-list.selection-multiple:focus-within .monaco-list-row.selected .cell-inner-container:not(.cell-editor-focus) .cell-focus-indicator-right:before { + border-color: var(--vscode-notebook-inactiveSelectedCellBorder, transparent) !important; +} + +/** Cell hover background */ +.notebookOverlay .code-cell-row:not(.focused):hover .cell-focus-indicator, +.notebookOverlay .code-cell-row:not(.focused).cell-output-hover .cell-focus-indicator, +.notebookOverlay .markdown-cell-row:not(.focused):hover { + background-color: var(--vscode-notebook-cellHoverBackground) !important; +} + +.notebookOverlay .code-cell-row:not(.focused):hover .input-collapse-container, +.notebookOverlay .code-cell-row:not(.focused).cell-output-hover .input-collapse-container { + background-color: var(--vscode-notebook-cellHoverBackground); +} + +/** Cell symbol higlight */ +.monaco-workbench .notebookOverlay .monaco-list .monaco-list-row.code-cell-row.nb-symbolHighlight .cell-focus-indicator, +.monaco-workbench .notebookOverlay .monaco-list .monaco-list-row.markdown-cell-row.nb-symbolHighlight { + background-color: var(--vscode-notebook-symbolHighlightBackground) !important; +} + +/** Cell focused editor border */ +.notebookOverlay .monaco-list:focus-within .monaco-list-row.focused .cell-editor-focus .cell-editor-part:before { + outline: solid 1px var(--vscode-notebook-focusedEditorBorder); +} + +/** Cell border color */ +.notebookOverlay .cell.markdown h1 { border-color: var(--vscode-notebook-cellBorderColor); } +.notebookOverlay .monaco-list-row .cell-editor-part:before { outline: solid 1px var(--vscode-notebook-cellBorderColor); } + +/** Cell status bar */ +.monaco-workbench .notebookOverlay .cell-statusbar-container .cell-language-picker:hover, +.monaco-workbench .notebookOverlay .cell-statusbar-container .cell-status-item.cell-status-item-has-command:hover { + background-color: var(--vscode-notebook-cellStatusBarItemHoverBackground); +} + +/** Insert toolbar */ +.notebookOverlay > .cell-list-container > .cell-list-insertion-indicator { + background-color: var(--vscode-notebook-cellInsertionIndicator); +} + +/** Scrollbar */ +.notebookOverlay .cell-list-container > .monaco-list > .monaco-scrollable-element > .scrollbar > .slider { + background: var(--vscode-notebookScrollbarSlider-background); +} + +.notebookOverlay .cell-list-container > .monaco-list > .monaco-scrollable-element > .scrollbar > .slider:hover { + background: var(--vscode-notebookScrollbarSlider-hoverBackground); +} + +.notebookOverlay .cell-list-container > .monaco-list > .monaco-scrollable-element > .scrollbar > .slider.active { + background: var(--vscode-notebookScrollbarSlider-activeBackground); +} + +/** Cell expand */ +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .expandInputIcon:hover, +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .expandOutputIcon:hover, +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .cell-expand-part-button:hover { + background-color: var(--vscode-toolbar-hoverBackground); +} + +/** Cell insertion/deletion */ +.monaco-workbench .notebookOverlay .monaco-list .monaco-list-row.code-cell-row.nb-cell-modified .cell-focus-indicator { + background-color: var(--vscode-editorGutter-modifiedBackground) !important; +} + +.monaco-workbench .notebookOverlay .monaco-list .monaco-list-row.markdown-cell-row.nb-cell-modified { + background-color: var(--vscode-editorGutter-modifiedBackground) !important; +} + +.monaco-workbench .notebookOverlay .monaco-list .monaco-list-row.code-cell-row.nb-cell-added .cell-focus-indicator { + background-color: var(--vscode-diffEditor-insertedTextBackground) !important; +} + +.monaco-workbench .notebookOverlay .monaco-list .monaco-list-row.markdown-cell-row.nb-cell-added { + background-color: var(--vscode-diffEditor-insertedTextBackground) !important; +} + +.monaco-workbench .notebookOverlay .monaco-list .monaco-list-row.code-cell-row.nb-cell-deleted .cell-focus-indicator { + background-color: var(--vscode-diffEditor-removedTextBackground) !important; +} + +.monaco-workbench .notebookOverlay .monaco-list .monaco-list-row.markdown-cell-row.nb-cell-deleted { + background-color: var(--vscode-diffEditor-removedTextBackground) !important; +} + +.monaco-workbench .notebookOverlay .codicon-debug-continue { color: var(--vscode-icon-foreground) !important; } diff --git a/src/vs/workbench/contrib/notebook/browser/media/notebookFocusIndicator.css b/src/vs/workbench/contrib/notebook/browser/media/notebookFocusIndicator.css index a8cf0c9b752..58e071ad4c9 100644 --- a/src/vs/workbench/contrib/notebook/browser/media/notebookFocusIndicator.css +++ b/src/vs/workbench/contrib/notebook/browser/media/notebookFocusIndicator.css @@ -54,19 +54,19 @@ .monaco-workbench .notebookOverlay .monaco-list:focus-within .monaco-list-row.focused .cell-editor-focus .cell-focus-indicator-top:before, .monaco-workbench .notebookOverlay .monaco-list:focus-within .monaco-list-row.focused .cell-editor-focus .cell-focus-indicator-bottom:before, .monaco-workbench .notebookOverlay .monaco-list:focus-within .monaco-list-row.focused .cell-inner-container.cell-editor-focus:before { - border-color: var(notebook-selected-cell-border-color) !important; + border-color: var(--vscode-notebook-selectedCellBorder) !important; } .monaco-workbench .notebookOverlay .monaco-list .monaco-list-row.focused .cell-focus-indicator-top:before, .monaco-workbench .notebookOverlay .monaco-list .monaco-list-row.focused .cell-focus-indicator-bottom:before { - border-color: var(--notebook-inactive-focused-cell-border-color) !important; + border-color: var(--vscode-notebook-inactiveFocusedCellBorder) !important; } .monaco-workbench .notebookOverlay .monaco-list:focus-within .monaco-list-row.focused .cell-inner-container:not(.cell-editor-focus) .cell-focus-indicator-top:before, .monaco-workbench .notebookOverlay .monaco-list:focus-within .monaco-list-row.focused .cell-inner-container:not(.cell-editor-focus) .cell-focus-indicator-bottom:before, .monaco-workbench .notebookOverlay .monaco-list:focus-within .monaco-list-row.focused .cell-inner-container:not(.cell-editor-focus) .cell-focus-indicator-left:before, .monaco-workbench .notebookOverlay .monaco-list:focus-within .monaco-list-row.focused .cell-inner-container:not(.cell-editor-focus) .cell-focus-indicator-right:before { - border-color: var(--notebook-focused-cell-border-color) !important; + border-color: var(--vscode-notebook-focusedCellBorder) !important; } .monaco-workbench .notebookOverlay .monaco-list .monaco-list-row .cell-focus-indicator-left .codeOutput-focus-indicator-container { diff --git a/src/vs/workbench/contrib/notebook/browser/media/notebookToolbar.css b/src/vs/workbench/contrib/notebook/browser/media/notebookToolbar.css index 5413489266c..53505527259 100644 --- a/src/vs/workbench/contrib/notebook/browser/media/notebookToolbar.css +++ b/src/vs/workbench/contrib/notebook/browser/media/notebookToolbar.css @@ -82,5 +82,5 @@ } .monaco-workbench .notebookOverlay .notebook-toolbar-container .monaco-action-bar .action-item .codicon-notebook-state-error { - color: var(--notebook-cell-status-icon-error); + color: var(--vscode-notebookStatusErrorIcon-foreground); } diff --git a/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts b/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts index bb855ef7455..a7e51972309 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts @@ -42,8 +42,7 @@ import { ILayoutService } from 'vs/platform/layout/browser/layoutService'; import { registerZIndex, ZIndex } from 'vs/platform/layout/browser/zIndexRegistry'; import { IEditorProgressService, IProgressRunner } from 'vs/platform/progress/common/progress'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { contrastBorder, diffInserted, diffRemoved, editorBackground, errorForeground, focusBorder, foreground, iconForeground, listInactiveSelectionBackground, registerColor, scrollbarSliderActiveBackground, scrollbarSliderBackground, scrollbarSliderHoverBackground, textBlockQuoteBackground, textBlockQuoteBorder, textLinkActiveForeground, textLinkForeground, textPreformatForeground, toolbarHoverBackground, transparent } from 'vs/platform/theme/common/colorRegistry'; -import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; +import { contrastBorder, errorForeground, focusBorder, foreground, listInactiveSelectionBackground, registerColor, scrollbarSliderActiveBackground, scrollbarSliderBackground, scrollbarSliderHoverBackground, transparent } from 'vs/platform/theme/common/colorRegistry'; import { EDITOR_PANE_BACKGROUND, PANEL_BORDER, SIDE_BAR_BACKGROUND } from 'vs/workbench/common/theme'; import { debugIconStartForeground } from 'vs/workbench/contrib/debug/browser/debugColors'; import { CellEditState, CellFindMatchWithIndex, CellFocusMode, CellLayoutContext, CellRevealType, IActiveNotebookEditorDelegate, IBaseCellEditorOptions, ICellOutputViewModel, ICellViewModel, ICommonCellInfo, IDisplayOutputLayoutUpdateRequest, IFocusNotebookCellOptions, IInsetRenderOutput, IModelDecorationsChangeAccessor, INotebookDeltaDecoration, INotebookEditor, INotebookEditorContribution, INotebookEditorContributionDescription, INotebookEditorCreationOptions, INotebookEditorDelegate, INotebookEditorMouseEvent, INotebookEditorOptions, INotebookEditorViewState, INotebookViewCellsUpdateEvent, INotebookWebviewMessage, RenderOutputType } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; @@ -77,7 +76,6 @@ import { NotebookOptions, OutputInnerContainerTopPadding } from 'vs/workbench/co import { ICellRange } from 'vs/workbench/contrib/notebook/common/notebookRange'; import { INotebookRendererMessagingService } from 'vs/workbench/contrib/notebook/common/notebookRendererMessagingService'; import { INotebookService } from 'vs/workbench/contrib/notebook/common/notebookService'; -import { editorGutterModifiedBackground } from 'vs/workbench/contrib/scm/browser/dirtydiffDecorator'; import { IWebviewElement } from 'vs/workbench/contrib/webview/browser/webview'; import { EditorExtensionsRegistry } from 'vs/editor/browser/editorExtensions'; import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; @@ -645,7 +643,7 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditorD border-radius: 4px; width: 0px; margin-left: ${focusIndicatorLeftMargin}px; - border-color: var(--notebook-inactive-focused-cell-border-color) !important; + border-color: var(--vscode-notebook-inactiveFocusedCellBorder) !important; } .monaco-workbench .notebookOverlay .monaco-list .monaco-list-row.focused .cell-focus-indicator-left .codeOutput-focus-indicator-container, @@ -664,7 +662,7 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditorD styleSheets.push(` .monaco-workbench .notebookOverlay .monaco-list .monaco-list-row.focused .cell-inner-container.cell-output-focus .cell-focus-indicator-left .codeOutput-focus-indicator, .monaco-workbench .notebookOverlay .monaco-list:focus-within .monaco-list-row.focused .cell-inner-container .cell-focus-indicator-left .codeOutput-focus-indicator { - border-color: var(--notebook-focused-cell-border-color) !important; + border-color: var(--vscode-notebook-focusedCellBorder) !important; } .monaco-workbench .notebookOverlay .monaco-list .monaco-list-row .cell-inner-container .cell-focus-indicator-left .output-focus-indicator { @@ -3110,240 +3108,3 @@ const notebookEditorBackground = registerColor('notebook.editorBackground', { hcDark: null, hcLight: null }, nls.localize('notebook.editorBackground', "Notebook background color.")); - -registerThemingParticipant((theme, collector) => { - // add css variable rules - - const focusedCellBorderColor = theme.getColor(focusedCellBorder); - const inactiveFocusedBorderColor = theme.getColor(inactiveFocusedCellBorder); - const selectedCellBorderColor = theme.getColor(selectedCellBorder); - collector.addRule(` - :root { - --notebook-focused-cell-border-color: ${focusedCellBorderColor}; - --notebook-inactive-focused-cell-border-color: ${inactiveFocusedBorderColor}; - --notebook-selected-cell-border-color: ${selectedCellBorderColor}; - } - `); - - const cellStatusIconSuccessColor = theme.getColor(cellStatusIconSuccess); - const cellStatusIconErrorColor = theme.getColor(cellStatusIconError); - const cellStatusIconRunningColor = theme.getColor(cellStatusIconRunning); - collector.addRule(` - :root { - --notebook-cell-status-icon-success: ${cellStatusIconSuccessColor}; - --notebook-cell-status-icon-error: ${cellStatusIconErrorColor}; - --notebook-cell-status-icon-running: ${cellStatusIconRunningColor}; - } - `); - - const link = theme.getColor(textLinkForeground); - if (link) { - collector.addRule(`.notebookOverlay .cell.markdown a, - .notebookOverlay .output-show-more-container a, - .notebookOverlay div.output-show-more a - { color: ${link};} `); - } - const activeLink = theme.getColor(textLinkActiveForeground); - if (activeLink) { - collector.addRule(`.notebookOverlay .output-show-more-container a:active, - .notebookOverlay .output-show-more a:active - { color: ${activeLink}; }`); - } - const shortcut = theme.getColor(textPreformatForeground); - if (shortcut) { - collector.addRule(`.notebookOverlay code, - .notebookOverlay .shortcut { color: ${shortcut}; }`); - } - const border = theme.getColor(contrastBorder); - if (border) { - collector.addRule(`.notebookOverlay .monaco-editor { border-color: ${border}; }`); - } - const quoteBackground = theme.getColor(textBlockQuoteBackground); - if (quoteBackground) { - collector.addRule(`.notebookOverlay blockquote { background: ${quoteBackground}; }`); - } - const quoteBorder = theme.getColor(textBlockQuoteBorder); - if (quoteBorder) { - collector.addRule(`.notebookOverlay blockquote { border-color: ${quoteBorder}; }`); - } - - const containerBackground = theme.getColor(notebookOutputContainerColor); - if (containerBackground) { - collector.addRule(`.notebookOverlay .output { background-color: ${containerBackground}; }`); - collector.addRule(`.notebookOverlay .output-element { background-color: ${containerBackground}; }`); - collector.addRule(`.notebookOverlay .output-show-more-container { background-color: ${containerBackground}; }`); - } - - const containerBorder = theme.getColor(notebookOutputContainerBorderColor); - if (containerBorder) { - collector.addRule(`.notebookOverlay .output-element { border-top: none !important; border: 1px solid transparent; border-color: ${containerBorder} !important; }`); - } - - const notebookBackground = theme.getColor(editorBackground); - if (notebookBackground) { - collector.addRule(`.notebookOverlay .cell-drag-image .cell-editor-container > div { background: ${notebookBackground} !important; }`); - collector.addRule(`.notebookOverlay .monaco-list-row .cell-title-toolbar { background-color: ${notebookBackground}; }`); - collector.addRule(`.notebookOverlay .monaco-list-row.cell-drag-image { background-color: ${notebookBackground}; }`); - collector.addRule(`.notebookOverlay .cell-bottom-toolbar-container .action-item { background-color: ${notebookBackground} }`); - collector.addRule(`.notebookOverlay .cell-list-top-cell-toolbar-container .action-item { background-color: ${notebookBackground} }`); - } - - const notebookBackgroundColor = theme.getColor(notebookEditorBackground); - - if (notebookBackgroundColor) { - collector.addRule(`.monaco-workbench .notebookOverlay.notebook-editor { background-color: ${notebookBackgroundColor}; }`); - } - - const editorBackgroundColor = theme.getColor(cellEditorBackground) ?? theme.getColor(editorBackground); - if (editorBackgroundColor) { - collector.addRule(`.notebookOverlay .cell .monaco-editor-background, - .notebookOverlay .cell .margin-view-overlays, - .notebookOverlay .cell .cell-statusbar-container { background: ${editorBackgroundColor}; }`); - } - - const cellToolbarSeperator = theme.getColor(CELL_TOOLBAR_SEPERATOR); - if (cellToolbarSeperator) { - collector.addRule(`.notebookOverlay .monaco-list-row .cell-title-toolbar { border: solid 1px ${cellToolbarSeperator}; }`); - collector.addRule(`.notebookOverlay .cell-bottom-toolbar-container .action-item { border: solid 1px ${cellToolbarSeperator} }`); - collector.addRule(`.notebookOverlay .cell-list-top-cell-toolbar-container .action-item { border: solid 1px ${cellToolbarSeperator} }`); - collector.addRule(`.notebookOverlay .monaco-action-bar .action-item.verticalSeparator { background-color: ${cellToolbarSeperator} }`); - collector.addRule(`.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .input-collapse-container { border-bottom: solid 1px ${cellToolbarSeperator} }`); - } - - const focusedCellBackgroundColor = theme.getColor(focusedCellBackground); - if (focusedCellBackgroundColor) { - collector.addRule(`.notebookOverlay .code-cell-row.focused .cell-focus-indicator { background-color: ${focusedCellBackgroundColor} !important; }`); - collector.addRule(`.notebookOverlay .markdown-cell-row.focused { background-color: ${focusedCellBackgroundColor} !important; }`); - collector.addRule(`.notebookOverlay .code-cell-row.focused .input-collapse-container { background-color: ${focusedCellBackgroundColor} !important; }`); - } - - const selectedCellBackgroundColor = theme.getColor(selectedCellBackground); - if (selectedCellBackground) { - collector.addRule(`.notebookOverlay .monaco-list.selection-multiple .markdown-cell-row.selected { background-color: ${selectedCellBackgroundColor} !important; }`); - collector.addRule(`.notebookOverlay .monaco-list.selection-multiple .code-cell-row.selected .cell-focus-indicator-top { background-color: ${selectedCellBackgroundColor} !important; }`); - collector.addRule(`.notebookOverlay .monaco-list.selection-multiple .code-cell-row.selected .cell-focus-indicator-left { background-color: ${selectedCellBackgroundColor} !important; }`); - collector.addRule(`.notebookOverlay .monaco-list.selection-multiple .code-cell-row.selected .cell-focus-indicator-right { background-color: ${selectedCellBackgroundColor} !important; }`); - collector.addRule(`.notebookOverlay .monaco-list.selection-multiple .code-cell-row.selected .cell-focus-indicator-bottom { background-color: ${selectedCellBackgroundColor} !important; }`); - } - - const inactiveSelectedCellBorderColor = theme.getColor(inactiveSelectedCellBorder); - collector.addRule(` - .notebookOverlay .monaco-list.selection-multiple:focus-within .monaco-list-row.selected .cell-focus-indicator-top:before, - .notebookOverlay .monaco-list.selection-multiple:focus-within .monaco-list-row.selected .cell-focus-indicator-bottom:before, - .notebookOverlay .monaco-list.selection-multiple:focus-within .monaco-list-row.selected .cell-inner-container:not(.cell-editor-focus) .cell-focus-indicator-left:before, - .notebookOverlay .monaco-list.selection-multiple:focus-within .monaco-list-row.selected .cell-inner-container:not(.cell-editor-focus) .cell-focus-indicator-right:before { - border-color: ${inactiveSelectedCellBorderColor} !important; - } - `); - - const cellHoverBackgroundColor = theme.getColor(cellHoverBackground); - if (cellHoverBackgroundColor) { - collector.addRule(`.notebookOverlay .code-cell-row:not(.focused):hover .cell-focus-indicator, - .notebookOverlay .code-cell-row:not(.focused).cell-output-hover .cell-focus-indicator, - .notebookOverlay .markdown-cell-row:not(.focused):hover { background-color: ${cellHoverBackgroundColor} !important; }`); - collector.addRule(`.notebookOverlay .code-cell-row:not(.focused):hover .input-collapse-container, - .notebookOverlay .code-cell-row:not(.focused).cell-output-hover .input-collapse-container { background-color: ${cellHoverBackgroundColor}; }`); - } - - const cellSymbolHighlightColor = theme.getColor(cellSymbolHighlight); - if (cellSymbolHighlightColor) { - collector.addRule(`.monaco-workbench .notebookOverlay .monaco-list .monaco-list-row.code-cell-row.nb-symbolHighlight .cell-focus-indicator, - .monaco-workbench .notebookOverlay .monaco-list .monaco-list-row.markdown-cell-row.nb-symbolHighlight { - background-color: ${cellSymbolHighlightColor} !important; - }`); - } - - const focusedEditorBorderColorColor = theme.getColor(focusedEditorBorderColor); - if (focusedEditorBorderColorColor) { - collector.addRule(`.notebookOverlay .monaco-list:focus-within .monaco-list-row.focused .cell-editor-focus .cell-editor-part:before { outline: solid 1px ${focusedEditorBorderColorColor}; }`); - } - - const cellBorderColor = theme.getColor(notebookCellBorder); - if (cellBorderColor) { - collector.addRule(`.notebookOverlay .cell.markdown h1 { border-color: ${cellBorderColor}; }`); - collector.addRule(`.notebookOverlay .monaco-list-row .cell-editor-part:before { outline: solid 1px ${cellBorderColor}; }`); - } - - const cellStatusBarHoverBg = theme.getColor(cellStatusBarItemHover); - if (cellStatusBarHoverBg) { - collector.addRule(`.monaco-workbench .notebookOverlay .cell-statusbar-container .cell-language-picker:hover, - .monaco-workbench .notebookOverlay .cell-statusbar-container .cell-status-item.cell-status-item-has-command:hover { background-color: ${cellStatusBarHoverBg}; }`); - } - - const cellInsertionIndicatorColor = theme.getColor(cellInsertionIndicator); - if (cellInsertionIndicatorColor) { - collector.addRule(`.notebookOverlay > .cell-list-container > .cell-list-insertion-indicator { background-color: ${cellInsertionIndicatorColor}; }`); - } - - const scrollbarSliderBackgroundColor = theme.getColor(listScrollbarSliderBackground); - if (scrollbarSliderBackgroundColor) { - collector.addRule(` .notebookOverlay .cell-list-container > .monaco-list > .monaco-scrollable-element > .scrollbar > .slider { background: ${scrollbarSliderBackgroundColor}; } `); - } - - const scrollbarSliderHoverBackgroundColor = theme.getColor(listScrollbarSliderHoverBackground); - if (scrollbarSliderHoverBackgroundColor) { - collector.addRule(` .notebookOverlay .cell-list-container > .monaco-list > .monaco-scrollable-element > .scrollbar > .slider:hover { background: ${scrollbarSliderHoverBackgroundColor}; } `); - } - - const scrollbarSliderActiveBackgroundColor = theme.getColor(listScrollbarSliderActiveBackground); - if (scrollbarSliderActiveBackgroundColor) { - collector.addRule(` .notebookOverlay .cell-list-container > .monaco-list > .monaco-scrollable-element > .scrollbar > .slider.active { background: ${scrollbarSliderActiveBackgroundColor}; } `); - } - - const toolbarHoverBackgroundColor = theme.getColor(toolbarHoverBackground); - if (toolbarHoverBackgroundColor) { - collector.addRule(` - .monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .expandInputIcon:hover, - .monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .expandOutputIcon:hover, - .monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .cell-expand-part-button:hover { - background-color: ${toolbarHoverBackgroundColor}; - } - `); - } - - - // case ChangeType.Modify: return theme.getColor(editorGutterModifiedBackground); - // case ChangeType.Add: return theme.getColor(editorGutterAddedBackground); - // case ChangeType.Delete: return theme.getColor(editorGutterDeletedBackground); - // diff - - const modifiedBackground = theme.getColor(editorGutterModifiedBackground); - if (modifiedBackground) { - collector.addRule(` - .monaco-workbench .notebookOverlay .monaco-list .monaco-list-row.code-cell-row.nb-cell-modified .cell-focus-indicator { - background-color: ${modifiedBackground} !important; - } - - .monaco-workbench .notebookOverlay .monaco-list .monaco-list-row.markdown-cell-row.nb-cell-modified { - background-color: ${modifiedBackground} !important; - }`); - } - - const addedBackground = theme.getColor(diffInserted); - if (addedBackground) { - collector.addRule(` - .monaco-workbench .notebookOverlay .monaco-list .monaco-list-row.code-cell-row.nb-cell-added .cell-focus-indicator { - background-color: ${addedBackground} !important; - } - - .monaco-workbench .notebookOverlay .monaco-list .monaco-list-row.markdown-cell-row.nb-cell-added { - background-color: ${addedBackground} !important; - }`); - } - const deletedBackground = theme.getColor(diffRemoved); - if (deletedBackground) { - collector.addRule(` - .monaco-workbench .notebookOverlay .monaco-list .monaco-list-row.code-cell-row.nb-cell-deleted .cell-focus-indicator { - background-color: ${deletedBackground} !important; - } - - .monaco-workbench .notebookOverlay .monaco-list .monaco-list-row.markdown-cell-row.nb-cell-deleted { - background-color: ${deletedBackground} !important; - }`); - } - - const iconForegroundColor = theme.getColor(iconForeground); - if (iconForegroundColor) { - collector.addRule(`.monaco-workbench .notebookOverlay .codicon-debug-continue { color: ${iconForegroundColor} !important; }`); - } -}); From 209a5cd5174436412bc975a467d8f5e908c8aea9 Mon Sep 17 00:00:00 2001 From: Henning Dieterichs Date: Thu, 3 Nov 2022 11:57:53 +0100 Subject: [PATCH 069/185] Fixes #165238 (#165242) --- .../contrib/mergeEditor/browser/model/mergeEditorModel.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/mergeEditor/browser/model/mergeEditorModel.ts b/src/vs/workbench/contrib/mergeEditor/browser/model/mergeEditorModel.ts index 6c80e750791..68e9fce6e62 100644 --- a/src/vs/workbench/contrib/mergeEditor/browser/model/mergeEditorModel.ts +++ b/src/vs/workbench/contrib/mergeEditor/browser/model/mergeEditorModel.ts @@ -152,7 +152,10 @@ export class MergeEditorModel extends EditorModel { state.handled.set(handled, tx); } - this.resultTextModel.setValue(this.computeAutoMergedResult()); + this.resultTextModel.pushEditOperations(null, [{ + range: new Range(1, 1, Number.MAX_SAFE_INTEGER, 1), + text: this.computeAutoMergedResult() + }], () => null); }); } From e9db45a0dec7a6fe622e7134a247cc45ec64a96f Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 3 Nov 2022 12:02:53 +0100 Subject: [PATCH 070/185] Fix #164690 #164730 (#165331) * Revert "Revert "Fix #164690 #164730 (#165279)" (#165302)" This reverts commit d9ed6d1ef4425d63428251a0182b5b9ae2b0d844. * store migration completion marker in profile --- .../sharedProcess/contrib/extensions.ts | 33 +++ .../contrib/extensionsCleaner.ts | 186 ------------- .../sharedProcess/sharedProcessMain.ts | 4 +- src/vs/code/electron-main/app.ts | 4 - src/vs/code/node/cliProcessMain.ts | 2 +- .../abstractExtensionManagementService.ts | 103 +++----- .../common/extensionManagement.ts | 3 +- .../common/extensionsProfileScannerService.ts | 2 +- .../common/extensionsScannerService.ts | 5 +- .../defaultExtensionsProfileInit.ts | 57 ---- .../node/extensionManagementService.ts | 173 ++++++------- .../node/extensionsWatcher.ts | 245 +++++++++++------- .../browser/userDataProfile.ts | 1 - .../userDataProfile/common/userDataProfile.ts | 12 +- .../common/userDataProfileService.test.ts | 5 +- .../userDataProfileMainService.test.ts | 4 - .../userDataSync/common/extensionsSync.ts | 14 +- .../common/userDataProfilesManifestSync.ts | 18 +- .../common/userDataSyncService.ts | 13 - .../server/node/remoteAgentEnvironmentImpl.ts | 3 + src/vs/server/node/serverServices.ts | 4 +- .../extensions/browser/extensionsActions.ts | 3 +- .../browser/webExtensionsScannerService.ts | 24 +- .../common/extensionManagement.ts | 12 +- .../common/webExtensionManagementService.ts | 19 +- .../nativeExtensionManagementService.ts | 4 +- .../cachedExtensionScanner.ts | 8 +- .../common/userDataProfileService.ts | 9 - .../electron-browser/workbenchTestServices.ts | 2 +- 29 files changed, 386 insertions(+), 586 deletions(-) create mode 100644 src/vs/code/electron-browser/sharedProcess/contrib/extensions.ts delete mode 100644 src/vs/code/electron-browser/sharedProcess/contrib/extensionsCleaner.ts delete mode 100644 src/vs/platform/extensionManagement/electron-main/defaultExtensionsProfileInit.ts diff --git a/src/vs/code/electron-browser/sharedProcess/contrib/extensions.ts b/src/vs/code/electron-browser/sharedProcess/contrib/extensions.ts new file mode 100644 index 00000000000..2ae46cb355a --- /dev/null +++ b/src/vs/code/electron-browser/sharedProcess/contrib/extensions.ts @@ -0,0 +1,33 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Disposable } from 'vs/base/common/lifecycle'; +import { DEFAULT_PROFILE_EXTENSIONS_MIGRATION_KEY, IExtensionGalleryService, IGlobalExtensionEnablementService } from 'vs/platform/extensionManagement/common/extensionManagement'; +import { ExtensionStorageService, IExtensionStorageService } from 'vs/platform/extensionManagement/common/extensionStorage'; +import { migrateUnsupportedExtensions } from 'vs/platform/extensionManagement/common/unsupportedExtensionsMigration'; +import { INativeServerExtensionManagementService } from 'vs/platform/extensionManagement/node/extensionManagementService'; +import { ILogService } from 'vs/platform/log/common/log'; +import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; + +export class ExtensionsContributions extends Disposable { + constructor( + @INativeServerExtensionManagementService extensionManagementService: INativeServerExtensionManagementService, + @IExtensionGalleryService extensionGalleryService: IExtensionGalleryService, + @IExtensionStorageService extensionStorageService: IExtensionStorageService, + @IGlobalExtensionEnablementService extensionEnablementService: IGlobalExtensionEnablementService, + @IStorageService storageService: IStorageService, + @ILogService logService: ILogService, + ) { + super(); + + extensionManagementService.migrateDefaultProfileExtensions() + .then(() => storageService.store(DEFAULT_PROFILE_EXTENSIONS_MIGRATION_KEY, true, StorageScope.APPLICATION, StorageTarget.MACHINE), error => null); + + extensionManagementService.removeUninstalledExtensions(); + migrateUnsupportedExtensions(extensionManagementService, extensionGalleryService, extensionStorageService, extensionEnablementService, logService); + ExtensionStorageService.removeOutdatedExtensionVersions(extensionManagementService, storageService); + } + +} diff --git a/src/vs/code/electron-browser/sharedProcess/contrib/extensionsCleaner.ts b/src/vs/code/electron-browser/sharedProcess/contrib/extensionsCleaner.ts deleted file mode 100644 index 7da094c5965..00000000000 --- a/src/vs/code/electron-browser/sharedProcess/contrib/extensionsCleaner.ts +++ /dev/null @@ -1,186 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import { Disposable, DisposableStore, MutableDisposable, toDisposable } from 'vs/base/common/lifecycle'; -import { URI } from 'vs/base/common/uri'; -import { IExtensionGalleryService, IExtensionIdentifier, IGlobalExtensionEnablementService, DidUninstallExtensionEvent, InstallExtensionResult, UninstallOptions } from 'vs/platform/extensionManagement/common/extensionManagement'; -import { getIdAndVersion } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; -import { IExtensionsProfileScannerService } from 'vs/platform/extensionManagement/common/extensionsProfileScannerService'; -import { ExtensionStorageService, IExtensionStorageService } from 'vs/platform/extensionManagement/common/extensionStorage'; -import { migrateUnsupportedExtensions } from 'vs/platform/extensionManagement/common/unsupportedExtensionsMigration'; -import { INativeServerExtensionManagementService } from 'vs/platform/extensionManagement/node/extensionManagementService'; -import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { ILogService } from 'vs/platform/log/common/log'; -import { IStorageService } from 'vs/platform/storage/common/storage'; -import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; -import { DidChangeProfilesEvent, IUserDataProfilesService } from 'vs/platform/userDataProfile/common/userDataProfile'; - -const uninstalOptions: UninstallOptions = { versionOnly: true, donotIncludePack: true, donotCheckDependents: true }; - -export class ExtensionsCleaner extends Disposable { - - constructor( - @INativeServerExtensionManagementService extensionManagementService: INativeServerExtensionManagementService, - @IUserDataProfilesService private readonly userDataProfilesService: IUserDataProfilesService, - @IExtensionGalleryService extensionGalleryService: IExtensionGalleryService, - @IExtensionStorageService extensionStorageService: IExtensionStorageService, - @IGlobalExtensionEnablementService extensionEnablementService: IGlobalExtensionEnablementService, - @IInstantiationService instantiationService: IInstantiationService, - @IStorageService storageService: IStorageService, - @ILogService logService: ILogService, - ) { - super(); - - extensionManagementService.removeUninstalledExtensions(this.userDataProfilesService.profiles.length === 1); - migrateUnsupportedExtensions(extensionManagementService, extensionGalleryService, extensionStorageService, extensionEnablementService, logService); - ExtensionStorageService.removeOutdatedExtensionVersions(extensionManagementService, storageService); - this._register(instantiationService.createInstance(ProfileExtensionsCleaner)); - } -} - -class ProfileExtensionsCleaner extends Disposable { - - private profileExtensionsLocations = new Map; - - private readonly profileModeDisposables = this._register(new MutableDisposable()); - - constructor( - @INativeServerExtensionManagementService private readonly extensionManagementService: INativeServerExtensionManagementService, - @IUserDataProfilesService private readonly userDataProfilesService: IUserDataProfilesService, - @IExtensionsProfileScannerService private readonly extensionsProfileScannerService: IExtensionsProfileScannerService, - @IUriIdentityService private readonly uriIdentityService: IUriIdentityService, - @ILogService private readonly logService: ILogService, - ) { - super(); - this.onDidChangeProfiles({ added: this.userDataProfilesService.profiles, removed: [], all: this.userDataProfilesService.profiles }); - } - - private async onDidChangeProfiles({ added, removed, all }: Omit): Promise { - try { - await Promise.all(removed.map(profile => profile.extensionsResource ? this.removeExtensionsFromProfile(profile.extensionsResource) : Promise.resolve())); - } catch (error) { - this.logService.error(error); - } - - if (all.length === 1) { - // Exit profile mode - this.profileModeDisposables.clear(); - // Listen for entering into profile mode - const disposable = this._register(this.userDataProfilesService.onDidChangeProfiles(() => { - disposable.dispose(); - this.onDidChangeProfiles({ added: this.userDataProfilesService.profiles, removed: [], all: this.userDataProfilesService.profiles }); - })); - return; - } - - try { - if (added.length) { - await Promise.all(added.map(profile => profile.extensionsResource ? this.populateExtensionsFromProfile(profile.extensionsResource) : Promise.resolve())); - // Enter profile mode - if (!this.profileModeDisposables.value) { - this.profileModeDisposables.value = new DisposableStore(); - this.profileModeDisposables.value.add(toDisposable(() => this.profileExtensionsLocations.clear())); - this.profileModeDisposables.value.add(this.userDataProfilesService.onDidChangeProfiles(e => this.onDidChangeProfiles(e))); - this.profileModeDisposables.value.add(this.extensionManagementService.onDidInstallExtensions(e => this.onDidInstallExtensions(e))); - this.profileModeDisposables.value.add(this.extensionManagementService.onDidUninstallExtension(e => this.onDidUninstallExtension(e))); - await this.uninstallExtensionsNotInProfiles(); - } - } - } catch (error) { - this.logService.error(error); - } - } - - private async uninstallExtensionsNotInProfiles(): Promise { - const installed = await this.extensionManagementService.getAllUserInstalled(); - const toUninstall = installed.filter(installedExtension => installedExtension.installedTimestamp /* Installed by VS Code */ && !this.profileExtensionsLocations.has(this.getKey(installedExtension.identifier, installedExtension.manifest.version))); - if (toUninstall.length) { - await Promise.all(toUninstall.map(extension => this.extensionManagementService.uninstall(extension, uninstalOptions))); - } - } - - private async onDidInstallExtensions(installedExtensions: readonly InstallExtensionResult[]): Promise { - for (const { local, profileLocation } of installedExtensions) { - if (!local || !profileLocation) { - continue; - } - this.addExtensionWithKey(this.getKey(local.identifier, local.manifest.version), profileLocation); - } - } - - private async onDidUninstallExtension(e: DidUninstallExtensionEvent): Promise { - if (!e.profileLocation || !e.version) { - return; - } - if (this.removeExtensionWithKey(this.getKey(e.identifier, e.version), e.profileLocation)) { - await this.uninstallExtensions([{ identifier: e.identifier, version: e.version }]); - } - } - - private async populateExtensionsFromProfile(extensionsProfileLocation: URI): Promise { - const extensions = await this.extensionsProfileScannerService.scanProfileExtensions(extensionsProfileLocation); - for (const extension of extensions) { - this.addExtensionWithKey(this.getKey(extension.identifier, extension.version), extensionsProfileLocation); - } - } - - private async removeExtensionsFromProfile(removedProfile: URI): Promise { - const extensionsToRemove: { identifier: IExtensionIdentifier; version: string }[] = []; - for (const key of [...this.profileExtensionsLocations.keys()]) { - if (!this.removeExtensionWithKey(key, removedProfile)) { - continue; - } - const extensionToRemove = this.fromKey(key); - if (extensionToRemove) { - extensionsToRemove.push(extensionToRemove); - } - } - if (extensionsToRemove.length) { - await this.uninstallExtensions(extensionsToRemove); - } - } - - private addExtensionWithKey(key: string, extensionsProfileLocation: URI): void { - let locations = this.profileExtensionsLocations.get(key); - if (!locations) { - locations = []; - this.profileExtensionsLocations.set(key, locations); - } - locations.push(extensionsProfileLocation); - } - - private removeExtensionWithKey(key: string, profileLocation: URI): boolean { - const profiles = this.profileExtensionsLocations.get(key); - if (profiles) { - const index = profiles.findIndex(profile => this.uriIdentityService.extUri.isEqual(profile, profileLocation)); - if (index > -1) { - profiles.splice(index, 1); - } - } - if (!profiles?.length) { - this.profileExtensionsLocations.delete(key); - return true; - } - return false; - } - - private async uninstallExtensions(extensionsToRemove: { identifier: IExtensionIdentifier; version: string }[]): Promise { - const installed = await this.extensionManagementService.getAllUserInstalled(); - const toUninstall = installed.filter(installedExtension => installedExtension.installedTimestamp /* Installed by VS Code */ && extensionsToRemove.some(e => this.getKey(installedExtension.identifier, installedExtension.manifest.version) === this.getKey(e.identifier, e.version))); - if (toUninstall.length) { - await Promise.all(toUninstall.map(extension => this.extensionManagementService.uninstall(extension, uninstalOptions))); - } - } - - private getKey(identifier: IExtensionIdentifier, version: string): string { - return `${ExtensionIdentifier.toKey(identifier.id)}@${version}`; - } - - private fromKey(key: string): { identifier: IExtensionIdentifier; version: string } | undefined { - const [id, version] = getIdAndVersion(key); - return version ? { identifier: { id }, version } : undefined; - } -} diff --git a/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts b/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts index f5bd9adc5a7..8c904e25308 100644 --- a/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts +++ b/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts @@ -14,7 +14,6 @@ import { URI } from 'vs/base/common/uri'; import { ProxyChannel, StaticRouter } from 'vs/base/parts/ipc/common/ipc'; import { Server as MessagePortServer } from 'vs/base/parts/ipc/electron-browser/ipc.mp'; import { CodeCacheCleaner } from 'vs/code/electron-browser/sharedProcess/contrib/codeCacheCleaner'; -import { ExtensionsCleaner } from 'vs/code/electron-browser/sharedProcess/contrib/extensionsCleaner'; import { LanguagePackCachedDataCleaner } from 'vs/code/electron-browser/sharedProcess/contrib/languagePackCachedDataCleaner'; import { LocalizationsUpdater } from 'vs/code/electron-browser/sharedProcess/contrib/localizationsUpdater'; import { LogsDataCleaner } from 'vs/code/electron-browser/sharedProcess/contrib/logsDataCleaner'; @@ -113,6 +112,7 @@ import { RemoteTunnelService } from 'vs/platform/remoteTunnel/electron-browser/r import { IRemoteTunnelService } from 'vs/platform/remoteTunnel/common/remoteTunnel'; import { ISharedProcessLifecycleService, SharedProcessLifecycleService } from 'vs/platform/lifecycle/electron-browser/sharedProcessLifecycleService'; import { UserDataSyncResourceProviderService } from 'vs/platform/userDataSync/common/userDataSyncResourceProvider'; +import { ExtensionsContributions } from 'vs/code/electron-browser/sharedProcess/contrib/extensions'; class SharedProcessMain extends Disposable { @@ -186,7 +186,7 @@ class SharedProcessMain extends Disposable { instantiationService.createInstance(UnusedWorkspaceStorageDataCleaner), instantiationService.createInstance(LogsDataCleaner), instantiationService.createInstance(LocalizationsUpdater), - instantiationService.createInstance(ExtensionsCleaner), + instantiationService.createInstance(ExtensionsContributions), instantiationService.createInstance(UserDataProfilesCleaner) )); } diff --git a/src/vs/code/electron-main/app.ts b/src/vs/code/electron-main/app.ts index b8e21690c1e..a9d491c4908 100644 --- a/src/vs/code/electron-main/app.ts +++ b/src/vs/code/electron-main/app.ts @@ -101,7 +101,6 @@ import { CredentialsNativeMainService } from 'vs/platform/credentials/electron-m import { IPolicyService } from 'vs/platform/policy/common/policy'; import { PolicyChannel } from 'vs/platform/policy/common/policyIpc'; import { IUserDataProfilesMainService } from 'vs/platform/userDataProfile/electron-main/userDataProfile'; -import { DefaultExtensionsProfileInitHandler } from 'vs/platform/extensionManagement/electron-main/defaultExtensionsProfileInit'; import { RequestChannel } from 'vs/platform/request/common/requestIpc'; import { IRequestService } from 'vs/platform/request/common/request'; import { ExtensionsProfileScannerService, IExtensionsProfileScannerService } from 'vs/platform/extensionManagement/common/extensionsProfileScannerService'; @@ -558,9 +557,6 @@ export class CodeApplication extends Disposable { // Auth Handler this._register(instantiationService.createInstance(ProxyAuthHandler)); - // Default Extensions Profile Init Handler - this._register(instantiationService.createInstance(DefaultExtensionsProfileInitHandler)); - // Transient profiles handler this._register(instantiationService.createInstance(UserDataTransientProfilesHandler)); } diff --git a/src/vs/code/node/cliProcessMain.ts b/src/vs/code/node/cliProcessMain.ts index 6c65566f766..3cf630f878f 100644 --- a/src/vs/code/node/cliProcessMain.ts +++ b/src/vs/code/node/cliProcessMain.ts @@ -245,7 +245,7 @@ class CliMain extends Disposable { } private async doRun(environmentService: INativeEnvironmentService, fileService: IFileService, userDataProfilesService: IUserDataProfilesService, instantiationService: IInstantiationService): Promise { - const profileLocation = environmentService.args.profile ? userDataProfilesService.profiles.find(p => p.name === environmentService.args.profile)?.extensionsResource : userDataProfilesService.defaultProfile.extensionsResource; + const profileLocation = (environmentService.args.profile ? userDataProfilesService.profiles.find(p => p.name === environmentService.args.profile) ?? userDataProfilesService.defaultProfile : userDataProfilesService.defaultProfile).extensionsResource; // Install Source if (this.argv['install-source']) { diff --git a/src/vs/platform/extensionManagement/common/abstractExtensionManagementService.ts b/src/vs/platform/extensionManagement/common/abstractExtensionManagementService.ts index 52696de6e81..183e4b527c6 100644 --- a/src/vs/platform/extensionManagement/common/abstractExtensionManagementService.ts +++ b/src/vs/platform/extensionManagement/common/abstractExtensionManagementService.ts @@ -24,6 +24,7 @@ import { IProductService } from 'vs/platform/product/common/productService'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IUserDataProfilesService } from 'vs/platform/userDataProfile/common/userDataProfile'; +export type InstallExtensionTaskOptions = InstallOptions & InstallVSIXOptions & { readonly profileLocation: URI }; export interface IInstallExtensionTask { readonly identifier: IExtensionIdentifier; readonly source: IGalleryExtension | URI; @@ -34,6 +35,7 @@ export interface IInstallExtensionTask { cancel(): void; } +export type UninstallExtensionTaskOptions = UninstallOptions & { readonly profileLocation: URI }; export interface IUninstallExtensionTask { readonly extension: ILocalExtension; run(): Promise; @@ -105,22 +107,6 @@ export abstract class AbstractExtensionManagementService extends Disposable impl return this.uninstallExtension(extension, options); } - async reinstallFromGallery(extension: ILocalExtension): Promise { - this.logService.trace('ExtensionManagementService#reinstallFromGallery', extension.identifier.id); - if (!this.galleryService.isEnabled()) { - throw new Error(nls.localize('MarketPlaceDisabled', "Marketplace is not enabled")); - } - - const targetPlatform = await this.getTargetPlatform(); - const [galleryExtension] = await this.galleryService.getExtensions([{ ...extension.identifier, preRelease: extension.preRelease }], { targetPlatform, compatible: true }, CancellationToken.None); - if (!galleryExtension) { - throw new Error(nls.localize('Not a Marketplace extension', "Only Marketplace Extensions can be reinstalled")); - } - - await this.createUninstallExtensionTask(extension, { remove: true, versionOnly: true }).run(); - await this.installFromGallery(galleryExtension); - } - getExtensionsControlManifest(): Promise { const now = new Date().getTime(); @@ -138,7 +124,12 @@ export abstract class AbstractExtensionManagementService extends Disposable impl protected async installExtension(manifest: IExtensionManifest, extension: URI | IGalleryExtension, options: InstallOptions & InstallVSIXOptions): Promise { - const getInstallExtensionTaskKey = (extension: IGalleryExtension) => `${ExtensionKey.create(extension).toString()}${options.profileLocation ? `-${options.profileLocation.toString()}` : ''}`; + const installExtensionTaskOptions: InstallExtensionTaskOptions = { + ...options, + installOnlyNewlyAddedFromExtensionPack: URI.isUri(extension) ? options.installOnlyNewlyAddedFromExtensionPack : true, /* always true for gallery extensions */ + profileLocation: !options.profileLocation || isApplicationScopedExtension(manifest) ? this.userDataProfilesService.defaultProfile.extensionsResource : options.profileLocation + }; + const getInstallExtensionTaskKey = (extension: IGalleryExtension) => `${ExtensionKey.create(extension).toString()}${installExtensionTaskOptions.profileLocation ? `-${installExtensionTaskOptions.profileLocation.toString()}` : ''}`; // only cache gallery extensions tasks if (!URI.isUri(extension)) { @@ -148,28 +139,27 @@ export abstract class AbstractExtensionManagementService extends Disposable impl const { local } = await installingExtension.task.waitUntilTaskIsFinished(); return local; } - options = { ...options, installOnlyNewlyAddedFromExtensionPack: true /* always true for gallery extensions */ }; } const allInstallExtensionTasks: { task: IInstallExtensionTask; manifest: IExtensionManifest }[] = []; const alreadyRequestedInstallations: Promise[] = []; const installResults: (InstallExtensionResult & { local: ILocalExtension })[] = []; - const installExtensionTask = this.createInstallExtensionTask(manifest, extension, options); + const installExtensionTask = this.createInstallExtensionTask(manifest, extension, installExtensionTaskOptions); if (!URI.isUri(extension)) { this.installingExtensions.set(getInstallExtensionTaskKey(extension), { task: installExtensionTask, waitingTasks: [] }); } - this._onInstallExtension.fire({ identifier: installExtensionTask.identifier, source: extension, profileLocation: options.profileLocation }); + this._onInstallExtension.fire({ identifier: installExtensionTask.identifier, source: extension, profileLocation: installExtensionTaskOptions.profileLocation }); this.logService.info('Installing extension:', installExtensionTask.identifier.id); allInstallExtensionTasks.push({ task: installExtensionTask, manifest }); let installExtensionHasDependents: boolean = false; try { - if (options.donotIncludePackAndDependencies) { + if (installExtensionTaskOptions.donotIncludePackAndDependencies) { this.logService.info('Installing the extension without checking dependencies and pack', installExtensionTask.identifier.id); } else { try { - const allDepsAndPackExtensionsToInstall = await this.getAllDepsAndPackExtensions(installExtensionTask.identifier, manifest, !!options.installOnlyNewlyAddedFromExtensionPack, !!options.installPreReleaseVersion, options.profileLocation); - const installed = await this.getInstalled(undefined, options.profileLocation); + const allDepsAndPackExtensionsToInstall = await this.getAllDepsAndPackExtensions(installExtensionTask.identifier, manifest, !!installExtensionTaskOptions.installOnlyNewlyAddedFromExtensionPack, !!installExtensionTaskOptions.installPreReleaseVersion, installExtensionTaskOptions.profileLocation); + const installed = await this.getInstalled(undefined, installExtensionTaskOptions.profileLocation); for (const { gallery, manifest } of allDepsAndPackExtensionsToInstall) { installExtensionHasDependents = installExtensionHasDependents || !!manifest.extensionDependencies?.some(id => areSameExtensions({ id }, installExtensionTask.identifier)); const key = getInstallExtensionTaskKey(gallery); @@ -192,9 +182,9 @@ export abstract class AbstractExtensionManagementService extends Disposable impl })); } } else if (!installed.some(({ identifier }) => areSameExtensions(identifier, gallery.identifier))) { - const task = this.createInstallExtensionTask(manifest, gallery, { ...options, donotIncludePackAndDependencies: true }); + const task = this.createInstallExtensionTask(manifest, gallery, { ...installExtensionTaskOptions, donotIncludePackAndDependencies: true }); this.installingExtensions.set(key, { task, waitingTasks: [installExtensionTask] }); - this._onInstallExtension.fire({ identifier: task.identifier, source: gallery, profileLocation: options.profileLocation }); + this._onInstallExtension.fire({ identifier: task.identifier, source: gallery, profileLocation: installExtensionTaskOptions.profileLocation }); this.logService.info('Installing extension:', task.identifier.id, installExtensionTask.identifier.id); allInstallExtensionTasks.push({ task, manifest }); } @@ -238,7 +228,7 @@ export abstract class AbstractExtensionManagementService extends Disposable impl const startTime = new Date().getTime(); try { const { local } = await task.run(); - await this.joinAllSettled(this.participants.map(participant => participant.postInstall(local, task.source, options, CancellationToken.None))); + await this.joinAllSettled(this.participants.map(participant => participant.postInstall(local, task.source, installExtensionTaskOptions, CancellationToken.None))); if (!URI.isUri(task.source)) { const isUpdate = task.operation === InstallOperation.Update; const durationSinceUpdate = isUpdate ? undefined : (new Date().getTime() - task.source.lastUpdated) / 1000; @@ -255,7 +245,7 @@ export abstract class AbstractExtensionManagementService extends Disposable impl } catch (error) { /* ignore */ } } } - installResults.push({ local, identifier: task.identifier, operation: task.operation, source: task.source, context: options.context, profileLocation: options.profileLocation, applicationScoped: local.isApplicationScoped }); + installResults.push({ local, identifier: task.identifier, operation: task.operation, source: task.source, context: installExtensionTaskOptions.context, profileLocation: installExtensionTaskOptions.profileLocation, applicationScoped: local.isApplicationScoped }); } catch (error) { if (!URI.isUri(task.source)) { reportTelemetry(this.telemetryService, task.operation === InstallOperation.Update ? 'extensionGallery:update' : 'extensionGallery:install', { @@ -287,7 +277,7 @@ export abstract class AbstractExtensionManagementService extends Disposable impl // rollback installed extensions if (installResults.length) { try { - const result = await Promise.allSettled(installResults.map(({ local }) => this.createUninstallExtensionTask(local, { versionOnly: true, profileLocation: options.profileLocation }).run())); + const result = await Promise.allSettled(installResults.map(({ local }) => this.createUninstallExtensionTask(local, { versionOnly: true, profileLocation: installExtensionTaskOptions.profileLocation }).run())); for (let index = 0; index < result.length; index++) { const r = result[index]; const { identifier } = installResults[index]; @@ -303,7 +293,7 @@ export abstract class AbstractExtensionManagementService extends Disposable impl } } - this._onDidInstallExtensions.fire(allInstallExtensionTasks.map(({ task }) => ({ identifier: task.identifier, operation: InstallOperation.Install, source: task.source, context: options.context, profileLocation: options.profileLocation }))); + this._onDidInstallExtensions.fire(allInstallExtensionTasks.map(({ task }) => ({ identifier: task.identifier, operation: InstallOperation.Install, source: task.source, context: installExtensionTaskOptions.context, profileLocation: installExtensionTaskOptions.profileLocation }))); throw error; } finally { for (const [key, { task, waitingTasks }] of this.installingExtensions.entries()) { @@ -475,50 +465,54 @@ export abstract class AbstractExtensionManagementService extends Disposable impl } private async uninstallExtension(extension: ILocalExtension, options: UninstallOptions): Promise { - const getUninstallExtensionTaskKey = (identifier: IExtensionIdentifier) => `${identifier.id.toLowerCase()}${options.versionOnly ? `-${extension.manifest.version}` : ''}${options.profileLocation ? `@${options.profileLocation.toString()}` : ''}`; + const uninstallOptions: UninstallExtensionTaskOptions = { + ...options, + profileLocation: !options.profileLocation || extension.isApplicationScoped ? this.userDataProfilesService.defaultProfile.extensionsResource : options.profileLocation + }; + const getUninstallExtensionTaskKey = (identifier: IExtensionIdentifier) => `${identifier.id.toLowerCase()}${uninstallOptions.versionOnly ? `-${extension.manifest.version}` : ''}${uninstallOptions.profileLocation ? `@${uninstallOptions.profileLocation.toString()}` : ''}`; const uninstallExtensionTask = this.uninstallingExtensions.get(getUninstallExtensionTaskKey(extension.identifier)); if (uninstallExtensionTask) { this.logService.info('Extensions is already requested to uninstall', extension.identifier.id); return uninstallExtensionTask.waitUntilTaskIsFinished(); } - const createUninstallExtensionTask = (extension: ILocalExtension, uninstallOptions: UninstallOptions): IUninstallExtensionTask => { + const createUninstallExtensionTask = (extension: ILocalExtension): IUninstallExtensionTask => { const uninstallExtensionTask = this.createUninstallExtensionTask(extension, uninstallOptions); this.uninstallingExtensions.set(getUninstallExtensionTaskKey(uninstallExtensionTask.extension.identifier), uninstallExtensionTask); - if (options.profileLocation) { - this.logService.info('Uninstalling extension from the profile:', `${extension.identifier.id}@${extension.manifest.version}`, options.profileLocation.toString()); + if (uninstallOptions.profileLocation) { + this.logService.info('Uninstalling extension from the profile:', `${extension.identifier.id}@${extension.manifest.version}`, uninstallOptions.profileLocation.toString()); } else { this.logService.info('Uninstalling extension:', `${extension.identifier.id}@${extension.manifest.version}`); } - this._onUninstallExtension.fire({ identifier: extension.identifier, profileLocation: options.profileLocation, applicationScoped: extension.isApplicationScoped }); + this._onUninstallExtension.fire({ identifier: extension.identifier, profileLocation: uninstallOptions.profileLocation, applicationScoped: extension.isApplicationScoped }); return uninstallExtensionTask; }; const postUninstallExtension = (extension: ILocalExtension, error?: ExtensionManagementError): void => { if (error) { - if (options.profileLocation) { - this.logService.error('Failed to uninstall extension from the profile:', `${extension.identifier.id}@${extension.manifest.version}`, options.profileLocation.toString(), error.message); + if (uninstallOptions.profileLocation) { + this.logService.error('Failed to uninstall extension from the profile:', `${extension.identifier.id}@${extension.manifest.version}`, uninstallOptions.profileLocation.toString(), error.message); } else { this.logService.error('Failed to uninstall extension:', `${extension.identifier.id}@${extension.manifest.version}`, error.message); } } else { - if (options.profileLocation) { - this.logService.info('Successfully uninstalled extension from the profile', `${extension.identifier.id}@${extension.manifest.version}`, options.profileLocation.toString()); + if (uninstallOptions.profileLocation) { + this.logService.info('Successfully uninstalled extension from the profile', `${extension.identifier.id}@${extension.manifest.version}`, uninstallOptions.profileLocation.toString()); } else { this.logService.info('Successfully uninstalled extension:', `${extension.identifier.id}@${extension.manifest.version}`); } } reportTelemetry(this.telemetryService, 'extensionGallery:uninstall', { extensionData: getLocalExtensionTelemetryData(extension), error }); - this._onDidUninstallExtension.fire({ identifier: extension.identifier, version: extension.manifest.version, error: error?.code, profileLocation: options.profileLocation, applicationScoped: extension.isApplicationScoped }); + this._onDidUninstallExtension.fire({ identifier: extension.identifier, version: extension.manifest.version, error: error?.code, profileLocation: uninstallOptions.profileLocation, applicationScoped: extension.isApplicationScoped }); }; const allTasks: IUninstallExtensionTask[] = []; const processedTasks: IUninstallExtensionTask[] = []; try { - allTasks.push(createUninstallExtensionTask(extension, options)); - const installed = await this.getInstalled(ExtensionType.User, options.profileLocation); - if (options.donotIncludePack) { + allTasks.push(createUninstallExtensionTask(extension)); + const installed = await this.getInstalled(ExtensionType.User, uninstallOptions.profileLocation); + if (uninstallOptions.donotIncludePack) { this.logService.info('Uninstalling the extension without including packed extension', `${extension.identifier.id}@${extension.manifest.version}`); } else { const packedExtensions = this.getAllPackExtensionsToUninstall(extension, installed); @@ -526,12 +520,12 @@ export abstract class AbstractExtensionManagementService extends Disposable impl if (this.uninstallingExtensions.has(getUninstallExtensionTaskKey(packedExtension.identifier))) { this.logService.info('Extensions is already requested to uninstall', packedExtension.identifier.id); } else { - allTasks.push(createUninstallExtensionTask(packedExtension, options)); + allTasks.push(createUninstallExtensionTask(packedExtension)); } } } - if (options.donotCheckDependents) { + if (uninstallOptions.donotCheckDependents) { this.logService.info('Uninstalling the extension without checking dependents', `${extension.identifier.id}@${extension.manifest.version}`); } else { this.checkForDependents(allTasks.map(task => task.extension), installed, extension); @@ -541,7 +535,7 @@ export abstract class AbstractExtensionManagementService extends Disposable impl await this.joinAllSettled(allTasks.map(async task => { try { await task.run(); - await this.joinAllSettled(this.participants.map(participant => participant.postUninstall(task.extension, options, CancellationToken.None))); + await this.joinAllSettled(this.participants.map(participant => participant.postUninstall(task.extension, uninstallOptions, CancellationToken.None))); // only report if extension has a mapped gallery extension. UUID identifies the gallery extension. if (task.extension.identifier.uuid) { try { @@ -652,20 +646,6 @@ export abstract class AbstractExtensionManagementService extends Disposable impl } } - private createInstallExtensionTask(manifest: IExtensionManifest, extension: URI | IGalleryExtension, options: InstallOptions & InstallVSIXOptions): IInstallExtensionTask { - if (options.profileLocation && isApplicationScopedExtension(manifest)) { - options = { ...options, profileLocation: this.userDataProfilesService.defaultProfile.extensionsResource }; - } - return this.doCreateInstallExtensionTask(manifest, extension, options); - } - - private createUninstallExtensionTask(extension: ILocalExtension, options: UninstallOptions): IUninstallExtensionTask { - if (options.profileLocation && extension.isApplicationScoped) { - options = { ...options, profileLocation: this.userDataProfilesService.defaultProfile.extensionsResource }; - } - return this.doCreateUninstallExtensionTask(extension, options); - } - abstract getTargetPlatform(): Promise; abstract zip(extension: ILocalExtension): Promise; abstract unzip(zipLocation: URI): Promise; @@ -673,13 +653,14 @@ export abstract class AbstractExtensionManagementService extends Disposable impl abstract install(vsix: URI, options?: InstallVSIXOptions): Promise; abstract getInstalled(type?: ExtensionType, profileLocation?: URI): Promise; abstract download(extension: IGalleryExtension, operation: InstallOperation): Promise; + abstract reinstallFromGallery(extension: ILocalExtension): Promise; abstract getMetadata(extension: ILocalExtension): Promise; abstract updateMetadata(local: ILocalExtension, metadata: IGalleryMetadata): Promise; abstract updateExtensionScope(local: ILocalExtension, isMachineScoped: boolean): Promise; - protected abstract doCreateInstallExtensionTask(manifest: IExtensionManifest, extension: URI | IGalleryExtension, options: InstallOptions & InstallVSIXOptions): IInstallExtensionTask; - protected abstract doCreateUninstallExtensionTask(extension: ILocalExtension, options: UninstallOptions): IUninstallExtensionTask; + protected abstract createInstallExtensionTask(manifest: IExtensionManifest, extension: URI | IGalleryExtension, options: InstallExtensionTaskOptions): IInstallExtensionTask; + protected abstract createUninstallExtensionTask(extension: ILocalExtension, options: UninstallExtensionTaskOptions): IUninstallExtensionTask; } export function joinErrors(errorOrErrors: (Error | string) | (Array)): Error { diff --git a/src/vs/platform/extensionManagement/common/extensionManagement.ts b/src/vs/platform/extensionManagement/common/extensionManagement.ts index ba3a2b083ce..89907b63d3c 100644 --- a/src/vs/platform/extensionManagement/common/extensionManagement.ts +++ b/src/vs/platform/extensionManagement/common/extensionManagement.ts @@ -16,6 +16,7 @@ import { createDecorator } from 'vs/platform/instantiation/common/instantiation' export const EXTENSION_IDENTIFIER_PATTERN = '^([a-z0-9A-Z][a-z0-9-A-Z]*)\\.([a-z0-9A-Z][a-z0-9-A-Z]*)$'; export const EXTENSION_IDENTIFIER_REGEX = new RegExp(EXTENSION_IDENTIFIER_PATTERN); export const WEB_EXTENSION_TAG = '__web_extension'; +export const DEFAULT_PROFILE_EXTENSIONS_MIGRATION_KEY = 'DEFAULT_PROFILE_EXTENSIONS_MIGRATION'; export function TargetPlatformToString(targetPlatform: TargetPlatform) { switch (targetPlatform) { @@ -498,13 +499,11 @@ export interface IExtensionTipsService { getAllWorkspacesTips(): Promise; } - export const ExtensionsLabel = localize('extensions', "Extensions"); export const ExtensionsLocalizedLabel = { value: ExtensionsLabel, original: 'Extensions' }; export const PreferencesLabel = localize('preferences', "Preferences"); export const PreferencesLocalizedLabel = { value: PreferencesLabel, original: 'Preferences' }; - export interface CLIOutput { log(s: string): void; error(s: string): void; diff --git a/src/vs/platform/extensionManagement/common/extensionsProfileScannerService.ts b/src/vs/platform/extensionManagement/common/extensionsProfileScannerService.ts index a182f889b9f..5bcb3ee7cdc 100644 --- a/src/vs/platform/extensionManagement/common/extensionsProfileScannerService.ts +++ b/src/vs/platform/extensionManagement/common/extensionsProfileScannerService.ts @@ -54,7 +54,7 @@ export class ExtensionsProfileScannerService extends Disposable implements IExte return this.withProfileExtensions(profileLocation); } - addExtensionsToProfile(extensions: [IExtension, Metadata][], profileLocation: URI): Promise { + addExtensionsToProfile(extensions: [IExtension, Metadata | undefined][], profileLocation: URI): Promise { return this.withProfileExtensions(profileLocation, profileExtensions => { // Remove the existing extension to avoid duplicates profileExtensions = profileExtensions.filter(e => extensions.some(([extension]) => !areSameExtensions(e.identifier, extension.identifier))); diff --git a/src/vs/platform/extensionManagement/common/extensionsScannerService.ts b/src/vs/platform/extensionManagement/common/extensionsScannerService.ts index 9ecfff2b321..3a49730edd0 100644 --- a/src/vs/platform/extensionManagement/common/extensionsScannerService.ts +++ b/src/vs/platform/extensionManagement/common/extensionsScannerService.ts @@ -190,8 +190,9 @@ export abstract class AbstractExtensionsScannerService extends Disposable implem } async scanUserExtensions(scanOptions: ScanOptions): Promise { - this.logService.trace('Started scanning user extensions'); - const extensionsScannerInput = await this.createExtensionScannerInput(scanOptions.profileLocation ?? this.userExtensionsLocation, !!scanOptions.profileLocation, ExtensionType.User, !scanOptions.includeUninstalled, scanOptions.language); + const location = scanOptions.profileLocation ?? this.userExtensionsLocation; + this.logService.trace('Started scanning user extensions', location); + const extensionsScannerInput = await this.createExtensionScannerInput(location, !!scanOptions.profileLocation, ExtensionType.User, !scanOptions.includeUninstalled, scanOptions.language); const extensionsScanner = scanOptions.useCache && !extensionsScannerInput.devMode && extensionsScannerInput.excludeObsolete ? this.userExtensionsCachedScanner : this.extensionsScanner; let extensions = await extensionsScanner.scanExtensions(extensionsScannerInput); extensions = await this.applyScanOptions(extensions, ExtensionType.User, scanOptions, true); diff --git a/src/vs/platform/extensionManagement/electron-main/defaultExtensionsProfileInit.ts b/src/vs/platform/extensionManagement/electron-main/defaultExtensionsProfileInit.ts deleted file mode 100644 index 12e63157320..00000000000 --- a/src/vs/platform/extensionManagement/electron-main/defaultExtensionsProfileInit.ts +++ /dev/null @@ -1,57 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import { Disposable } from 'vs/base/common/lifecycle'; -import { joinPath } from 'vs/base/common/resources'; -import { URI } from 'vs/base/common/uri'; -import { IExtensionsProfileScannerService } from 'vs/platform/extensionManagement/common/extensionsProfileScannerService'; -import { IExtensionsScannerService } from 'vs/platform/extensionManagement/common/extensionsScannerService'; -import { IFileService } from 'vs/platform/files/common/files'; -import { ILogService } from 'vs/platform/log/common/log'; -import { EXTENSIONS_RESOURCE_NAME } from 'vs/platform/userDataProfile/common/userDataProfile'; -import { IUserDataProfilesMainService } from 'vs/platform/userDataProfile/electron-main/userDataProfile'; - -export class DefaultExtensionsProfileInitHandler extends Disposable { - constructor( - @IUserDataProfilesMainService private readonly userDataProfilesService: IUserDataProfilesMainService, - @IFileService private readonly fileService: IFileService, - @IExtensionsScannerService private readonly extensionsScannerService: IExtensionsScannerService, - @IExtensionsProfileScannerService private readonly extensionsProfileScannerService: IExtensionsProfileScannerService, - @ILogService logService: ILogService, - ) { - super(); - if (userDataProfilesService.isEnabled()) { - this._register(userDataProfilesService.onWillCreateProfile(e => { - if (userDataProfilesService.profiles.length === 1) { - e.join(this.initialize()); - } - })); - this._register(userDataProfilesService.onDidChangeProfiles(e => { - if (userDataProfilesService.profiles.length === 1) { - this.uninitialize(); - } - })); - } else { - this.uninitialize().then(null, e => logService.error(e)); - } - } - - private async initialize(): Promise { - /* Create and populate the default extensions profile resource */ - const extensionsProfileResource = this.getDefaultExtensionsProfileResource(); - try { await this.fileService.del(extensionsProfileResource); } catch (error) { /* ignore */ } - const userExtensions = await this.extensionsScannerService.scanUserExtensions({ includeInvalid: true }); - await this.extensionsProfileScannerService.addExtensionsToProfile(userExtensions.map(e => [e, e.metadata]), extensionsProfileResource); - } - - private async uninitialize(): Promise { - /* Remove the default extensions profile resource */ - try { await this.fileService.del(this.getDefaultExtensionsProfileResource()); } catch (error) { /* ignore */ } - } - - private getDefaultExtensionsProfileResource(): URI { - return this.userDataProfilesService.defaultProfile.extensionsResource ?? joinPath(this.userDataProfilesService.defaultProfile.location, EXTENSIONS_RESOURCE_NAME); - } -} diff --git a/src/vs/platform/extensionManagement/node/extensionManagementService.ts b/src/vs/platform/extensionManagement/node/extensionManagementService.ts index 520c5667aae..683470a4689 100644 --- a/src/vs/platform/extensionManagement/node/extensionManagementService.ts +++ b/src/vs/platform/extensionManagement/node/extensionManagementService.ts @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { Promises, Queue } from 'vs/base/common/async'; +import { VSBuffer } from 'vs/base/common/buffer'; import { CancellationToken } from 'vs/base/common/cancellation'; import { IStringDictionary } from 'vs/base/common/collections'; import { toErrorMessage } from 'vs/base/common/errorMessage'; @@ -22,10 +23,10 @@ import { extract, ExtractError, IFile, zip } from 'vs/base/node/zip'; import * as nls from 'vs/nls'; import { IDownloadService } from 'vs/platform/download/common/download'; import { INativeEnvironmentService } from 'vs/platform/environment/common/environment'; -import { AbstractExtensionManagementService, AbstractExtensionTask, IInstallExtensionTask, IUninstallExtensionTask, joinErrors } from 'vs/platform/extensionManagement/common/abstractExtensionManagementService'; +import { AbstractExtensionManagementService, AbstractExtensionTask, IInstallExtensionTask, InstallExtensionTaskOptions, IUninstallExtensionTask, joinErrors, UninstallExtensionTaskOptions } from 'vs/platform/extensionManagement/common/abstractExtensionManagementService'; import { ExtensionManagementError, ExtensionManagementErrorCode, IExtensionGalleryService, IExtensionIdentifier, IExtensionManagementService, IGalleryExtension, IGalleryMetadata, ILocalExtension, InstallOperation, - Metadata, InstallOptions, InstallVSIXOptions, UninstallOptions + Metadata, InstallOptions, InstallVSIXOptions } from 'vs/platform/extensionManagement/common/extensionManagement'; import { areSameExtensions, computeTargetPlatform, ExtensionKey, getGalleryExtensionId, groupByExtension } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { IExtensionsProfileScannerService } from 'vs/platform/extensionManagement/common/extensionsProfileScannerService'; @@ -54,7 +55,9 @@ interface InstallableExtension { export const INativeServerExtensionManagementService = refineServiceDecorator(IExtensionManagementService); export interface INativeServerExtensionManagementService extends IExtensionManagementService { readonly _serviceBrand: undefined; - removeUninstalledExtensions(removeOutdated: boolean): Promise; + migrateDefaultProfileExtensions(): Promise; + markAsUninstalled(...extensions: ILocalExtension[]): Promise; + removeUninstalledExtensions(): Promise; getAllUserInstalled(): Promise; } @@ -85,13 +88,13 @@ export class ExtensionManagementService extends AbstractExtensionManagementServi this.extensionsScanner = this._register(instantiationService.createInstance(ExtensionsScanner, extension => extensionLifecycle.postUninstall(extension))); this.manifestCache = this._register(new ExtensionsManifestCache(environmentService, this)); this.extensionsDownloader = this._register(instantiationService.createInstance(ExtensionsDownloader)); - const extensionsWatcher = this._register(new ExtensionsWatcher(this, fileService, environmentService, logService, uriIdentityService)); + const extensionsWatcher = this._register(new ExtensionsWatcher(this, userDataProfilesService, extensionsProfileScannerService, extensionsScannerService, uriIdentityService, fileService, logService)); this._register(extensionsWatcher.onDidChangeExtensionsByAnotherSource(({ added, removed }) => { if (added.length) { - this._onDidInstallExtensions.fire(added.map(local => ({ identifier: local.identifier, operation: InstallOperation.None, local }))); + this._onDidInstallExtensions.fire(added); } - removed.forEach(extension => this._onDidUninstallExtension.fire({ identifier: extension })); + removed.forEach(e => this._onDidUninstallExtension.fire(e)); })); } @@ -131,7 +134,7 @@ export class ExtensionManagementService extends AbstractExtensionManagementServi } getAllUserInstalled(): Promise { - return this.extensionsScanner.scanUserExtensions(false); + return this.extensionsScanner.scanAllUserExtensions(false); } async install(vsix: URI, options: InstallVSIXOptions = {}): Promise { @@ -173,8 +176,37 @@ export class ExtensionManagementService extends AbstractExtensionManagementServi return local; } - removeUninstalledExtensions(removeOutdated: boolean): Promise { - return this.extensionsScanner.cleanUp(removeOutdated); + async reinstallFromGallery(extension: ILocalExtension): Promise { + this.logService.trace('ExtensionManagementService#reinstallFromGallery', extension.identifier.id); + if (!this.galleryService.isEnabled()) { + throw new Error(nls.localize('MarketPlaceDisabled', "Marketplace is not enabled")); + } + + const targetPlatform = await this.getTargetPlatform(); + const [galleryExtension] = await this.galleryService.getExtensions([{ ...extension.identifier, preRelease: extension.preRelease }], { targetPlatform, compatible: true }, CancellationToken.None); + if (!galleryExtension) { + throw new Error(nls.localize('Not a Marketplace extension', "Only Marketplace Extensions can be reinstalled")); + } + + await this.extensionsScanner.setUninstalled(extension); + try { + await this.extensionsScanner.removeUninstalledExtension(extension); + } catch (e) { + throw new Error(nls.localize('removeError', "Error while removing the extension: {0}. Please Quit and Start VS Code before trying again.", toErrorMessage(e))); + } + await this.installFromGallery(galleryExtension); + } + + markAsUninstalled(...extensions: ILocalExtension[]): Promise { + return this.extensionsScanner.setUninstalled(...extensions); + } + + removeUninstalledExtensions(): Promise { + return this.extensionsScanner.cleanUp(); + } + + migrateDefaultProfileExtensions(): Promise { + return this.extensionsScanner.migrateDefaultProfileExtensions(); } async download(extension: IGalleryExtension, operation: InstallOperation): Promise { @@ -200,7 +232,7 @@ export class ExtensionManagementService extends AbstractExtensionManagementServi return { location, cleanup }; } - protected doCreateInstallExtensionTask(manifest: IExtensionManifest, extension: URI | IGalleryExtension, options: InstallOptions & InstallVSIXOptions): IInstallExtensionTask { + protected createInstallExtensionTask(manifest: IExtensionManifest, extension: URI | IGalleryExtension, options: InstallExtensionTaskOptions): IInstallExtensionTask { let installExtensionTask: IInstallExtensionTask | undefined; if (URI.isUri(extension)) { installExtensionTask = new InstallVSIXTask(manifest, extension, options, this.galleryService, this.extensionsScanner, this.logService); @@ -212,17 +244,11 @@ export class ExtensionManagementService extends AbstractExtensionManagementServi installExtensionTask.waitUntilTaskIsFinished().then(() => this.installGalleryExtensionsTasks.delete(key)); } } - if (options.profileLocation) { - return new InstallExtensionInProfileTask(installExtensionTask, options.profileLocation, this.extensionsProfileScannerService); - } - return installExtensionTask; + return new InstallExtensionInProfileTask(installExtensionTask, options.profileLocation, this.extensionsProfileScannerService); } - protected doCreateUninstallExtensionTask(extension: ILocalExtension, options: UninstallOptions): IUninstallExtensionTask { - if (options.profileLocation) { - return new UninstallExtensionFromProfileTask(extension, options.profileLocation, this.extensionsProfileScannerService); - } - return new UninstallExtensionTask(extension, options, this.extensionsScanner); + protected createUninstallExtensionTask(extension: ILocalExtension, options: UninstallExtensionTaskOptions): IUninstallExtensionTask { + return new UninstallExtensionFromProfileTask(extension, options.profileLocation, this.extensionsProfileScannerService); } private async collectFiles(extension: ILocalExtension): Promise { @@ -261,6 +287,8 @@ export class ExtensionsScanner extends Disposable { private readonly beforeRemovingExtension: (e: ILocalExtension) => Promise, @IFileService private readonly fileService: IFileService, @IExtensionsScannerService private readonly extensionsScannerService: IExtensionsScannerService, + @IUserDataProfilesService private readonly userDataProfilesService: IUserDataProfilesService, + @IExtensionsProfileScannerService private readonly extensionsProfileScannerService: IExtensionsProfileScannerService, @ILogService private readonly logService: ILogService, ) { super(); @@ -268,14 +296,12 @@ export class ExtensionsScanner extends Disposable { this.uninstalledFileLimiter = new Queue(); } - async cleanUp(removeOutdated: boolean): Promise { + async cleanUp(): Promise { await this.removeUninstalledExtensions(); - if (removeOutdated) { - await this.removeOutdatedExtensions(); - } } async scanExtensions(type: ExtensionType | null, profileLocation: URI | undefined): Promise { + await this.migrateDefaultProfileExtensions(); const userScanOptions: ScanOptions = { includeInvalid: true, profileLocation }; let scannedExtensions: IScannedExtension[] = []; if (type === null || type === ExtensionType.System) { @@ -287,12 +313,13 @@ export class ExtensionsScanner extends Disposable { return Promise.all(scannedExtensions.map(extension => this.toLocalExtension(extension))); } - async scanUserExtensions(excludeOutdated: boolean): Promise { + async scanAllUserExtensions(excludeOutdated: boolean): Promise { const scannedExtensions = await this.extensionsScannerService.scanUserExtensions({ includeAllVersions: !excludeOutdated, includeInvalid: true }); return Promise.all(scannedExtensions.map(extension => this.toLocalExtension(extension))); } async extractUserExtension(extensionKey: ExtensionKey, zipPath: string, metadata: Metadata, token: CancellationToken): Promise { + await this.migrateDefaultProfileExtensions(); const folderName = extensionKey.toString(); const tempPath = path.join(this.extensionsScannerService.userExtensionsLocation.fsPath, `.${generateUuid()}`); const extensionPath = path.join(this.extensionsScannerService.userExtensionsLocation.fsPath, folderName); @@ -335,14 +362,16 @@ export class ExtensionsScanner extends Disposable { async setUninstalled(...extensions: ILocalExtension[]): Promise { const extensionKeys: ExtensionKey[] = extensions.map(e => ExtensionKey.create(e)); - await this.withUninstalledExtensions(uninstalled => { - extensionKeys.forEach(extensionKey => uninstalled[extensionKey.toString()] = true); - }); + await this.withUninstalledExtensions(uninstalled => + extensionKeys.forEach(extensionKey => { + uninstalled[extensionKey.toString()] = true; + this.logService.info('Marked extension as uninstalled', extensionKey.toString()); + })); } async setInstalled(extensionKey: ExtensionKey): Promise { await this.withUninstalledExtensions(uninstalled => delete uninstalled[extensionKey.toString()]); - const userExtensions = await this.scanUserExtensions(true); + const userExtensions = await this.scanAllUserExtensions(true); const localExtension = userExtensions.find(i => ExtensionKey.create(i).equals(extensionKey)) || null; if (!localExtension) { return null; @@ -489,35 +518,33 @@ export class ExtensionsScanner extends Disposable { await Promises.settled(toRemove.map(e => this.removeUninstalledExtension(e))); } - private async removeOutdatedExtensions(): Promise { - const systemExtensions = await this.extensionsScannerService.scanSystemExtensions({}); // System extensions - const extensions = await this.extensionsScannerService.scanUserExtensions({ includeAllVersions: true, includeUninstalled: true, includeInvalid: true }); // All user extensions - const toRemove: IScannedExtension[] = []; - - // Outdated extensions - const targetPlatform = await this.extensionsScannerService.getTargetPlatform(); - const byExtension = groupByExtension(extensions, e => e.identifier); - for (const extensions of byExtension) { - if (extensions.length > 1) { - toRemove.push(...extensions.sort((a, b) => { - const vcompare = semver.rcompare(a.manifest.version, b.manifest.version); - if (vcompare !== 0) { - return vcompare; + private _migrateDefaultProfileExtensionsPromise: Promise | undefined = undefined; + migrateDefaultProfileExtensions(): Promise { + if (!this._migrateDefaultProfileExtensionsPromise) { + this._migrateDefaultProfileExtensionsPromise = (async () => { + try { + const migrationMarkerFile = joinPath(this.userDataProfilesService.defaultProfile.location, '.migrated-default-profile'); + if (await this.fileService.exists(migrationMarkerFile)) { + return; } - if (a.targetPlatform === targetPlatform) { - return -1; + if (!(await this.fileService.exists(this.userDataProfilesService.defaultProfile.extensionsResource))) { + this.logService.info('Started migrating default profile extensions from extensions installation folder to extensions manifest.'); + const userExtensions = await this.extensionsScannerService.scanUserExtensions({ includeInvalid: true }); + await this.extensionsProfileScannerService.addExtensionsToProfile(userExtensions.map(e => [e, e.metadata]), this.userDataProfilesService.defaultProfile.extensionsResource); + this.logService.info('Completed migrating default profile extensions from extensions installation folder to extensions manifest.'); } - return 1; - }).slice(1)); - } - if (extensions[0].type === ExtensionType.System) { - const systemExtension = systemExtensions.find(e => areSameExtensions(e.identifier, extensions[0].identifier)); - if (!systemExtension || semver.gte(systemExtension.manifest.version, extensions[0].manifest.version)) { - toRemove.push(extensions[0]); + try { + await this.fileService.createFile(migrationMarkerFile, VSBuffer.fromString('')); + } catch (error) { + this.logService.warn('Failed to create migration marker file for default profile extensions migration.', getErrorMessage(error)); + } + } catch (error) { + this.logService.error(error); + throw error; } - } + })(); } - await Promises.settled(toRemove.map(extension => this.removeExtension(extension, 'outdated'))); + return this._migrateDefaultProfileExtensionsPromise; } private joinErrors(errorOrErrors: (Error | string) | (Array)): Error { @@ -775,46 +802,6 @@ class InstallExtensionInProfileTask implements IInstallExtensionTask { } } -class UninstallExtensionTask extends AbstractExtensionTask implements IUninstallExtensionTask { - - constructor( - readonly extension: ILocalExtension, - private readonly options: UninstallOptions, - private readonly extensionsScanner: ExtensionsScanner, - ) { - super(); - } - - protected async doRun(token: CancellationToken): Promise { - const toUninstall: ILocalExtension[] = []; - const userExtensions = await this.extensionsScanner.scanUserExtensions(false); - if (this.options.versionOnly) { - const extensionKey = ExtensionKey.create(this.extension); - toUninstall.push(...userExtensions.filter(u => extensionKey.equals(ExtensionKey.create(u)))); - } else { - toUninstall.push(...userExtensions.filter(u => areSameExtensions(u.identifier, this.extension.identifier))); - } - - if (!toUninstall.length) { - throw new Error(nls.localize('notInstalled', "Extension '{0}' is not installed.", this.extension.manifest.displayName || this.extension.manifest.name)); - } - await this.extensionsScanner.setUninstalled(...toUninstall); - - if (this.options.remove) { - for (const extension of toUninstall) { - try { - if (!token.isCancellationRequested) { - await this.extensionsScanner.removeUninstalledExtension(extension); - } - } catch (e) { - throw new Error(nls.localize('removeError', "Error while removing the extension: {0}. Please Quit and Start VS Code before trying again.", toErrorMessage(e))); - } - } - } - } - -} - class UninstallExtensionFromProfileTask extends AbstractExtensionTask implements IUninstallExtensionTask { constructor( diff --git a/src/vs/platform/extensionManagement/node/extensionsWatcher.ts b/src/vs/platform/extensionManagement/node/extensionsWatcher.ts index 2693b4e10bd..e04c1b8b869 100644 --- a/src/vs/platform/extensionManagement/node/extensionsWatcher.ts +++ b/src/vs/platform/extensionManagement/node/extensionsWatcher.ts @@ -6,42 +6,49 @@ import { Emitter, Event } from 'vs/base/common/event'; import { Disposable } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; -import { INativeEnvironmentService } from 'vs/platform/environment/common/environment'; -import { DidUninstallExtensionEvent, IExtensionManagementService, ILocalExtension, InstallExtensionEvent, InstallExtensionResult } from 'vs/platform/extensionManagement/common/extensionManagement'; -import { areSameExtensions } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; -import { IExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; +import { DidUninstallExtensionEvent, InstallExtensionResult, InstallOperation } from 'vs/platform/extensionManagement/common/extensionManagement'; +import { getIdAndVersion } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; +import { IExtensionsProfileScannerService } from 'vs/platform/extensionManagement/common/extensionsProfileScannerService'; +import { IExtensionsScannerService } from 'vs/platform/extensionManagement/common/extensionsScannerService'; +import { INativeServerExtensionManagementService } from 'vs/platform/extensionManagement/node/extensionManagementService'; +import { ExtensionIdentifier, IExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; import { FileChangeType, IFileChange, IFileService } from 'vs/platform/files/common/files'; import { ILogService } from 'vs/platform/log/common/log'; import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; +import { IUserDataProfile, IUserDataProfilesService } from 'vs/platform/userDataProfile/common/userDataProfile'; export class ExtensionsWatcher extends Disposable { - private readonly _onDidChangeExtensionsByAnotherSource = this._register(new Emitter<{ added: ILocalExtension[]; removed: IExtensionIdentifier[] }>()); + private readonly _onDidChangeExtensionsByAnotherSource = this._register(new Emitter<{ added: InstallExtensionResult[]; removed: DidUninstallExtensionEvent[] }>()); readonly onDidChangeExtensionsByAnotherSource = this._onDidChangeExtensionsByAnotherSource.event; - private startTimestamp = 0; - private installingExtensions: IExtensionIdentifier[] = []; - private installedExtensions: IExtensionIdentifier[] | undefined; + private readonly profileExtensionsLocations = new Map; constructor( - private readonly extensionsManagementService: IExtensionManagementService, - @IFileService fileService: IFileService, - @INativeEnvironmentService environmentService: INativeEnvironmentService, - @ILogService private readonly logService: ILogService, - @IUriIdentityService private readonly uriIdentityService: IUriIdentityService, + private readonly extensionManagementService: INativeServerExtensionManagementService, + private readonly userDataProfilesService: IUserDataProfilesService, + private readonly extensionsProfileScannerService: IExtensionsProfileScannerService, + private readonly extensionsScannerService: IExtensionsScannerService, + private readonly uriIdentityService: IUriIdentityService, + private readonly fileService: IFileService, + private readonly logService: ILogService, ) { super(); - this.extensionsManagementService.getInstalled().then(extensions => { - this.installedExtensions = extensions.map(e => e.identifier); - this.startTimestamp = Date.now(); - }); - this._register(extensionsManagementService.onInstallExtension(e => this.onInstallExtension(e))); - this._register(extensionsManagementService.onDidInstallExtensions(e => this.onDidInstallExtensions(e))); - this._register(extensionsManagementService.onDidUninstallExtension(e => this.onDidUninstallExtension(e))); + this.initialize().then(() => this.registerListeners(), error => logService.error(error)); + } - const extensionsResource = URI.file(environmentService.extensionsPath); - this._register(fileService.watch(extensionsResource)); - this._register(Event.filter(fileService.onDidFilesChange, e => e.rawChanges.some(change => this.doesChangeAffects(change, extensionsResource)))(() => this.onDidChange())); + private async initialize(): Promise { + await this.extensionManagementService.migrateDefaultProfileExtensions(); + await this.onDidChangeProfiles(this.userDataProfilesService.profiles, []); + await this.uninstallExtensionsNotInProfiles(); + } + + private registerListeners(): void { + this._register(this.userDataProfilesService.onDidChangeProfiles(e => this.onDidChangeProfiles(e.added, e.removed))); + this._register(this.extensionManagementService.onDidInstallExtensions(e => this.onDidInstallExtensions(e))); + this._register(this.extensionManagementService.onDidUninstallExtension(e => this.onDidUninstallExtension(e))); + this._register(this.fileService.watch(this.extensionsScannerService.userExtensionsLocation)); + this._register(Event.filter(this.fileService.onDidFilesChange, e => e.rawChanges.some(change => this.doesChangeAffects(change, this.extensionsScannerService.userExtensionsLocation)))(() => this.onDidChange())); } private doesChangeAffects(change: IFileChange, extensionsResource: URI): boolean { @@ -68,78 +75,136 @@ export class ExtensionsWatcher extends Disposable { return true; } - private onInstallExtension(e: InstallExtensionEvent): void { - this.addInstallingExtension(e.identifier); - } - - private onDidInstallExtensions(results: readonly InstallExtensionResult[]): void { - for (const e of results) { - this.removeInstallingExtension(e.identifier); - if (e.local) { - this.addInstalledExtension(e.identifier); - } - } - } - - private onDidUninstallExtension(e: DidUninstallExtensionEvent): void { - if (!e.error) { - this.removeInstalledExtension(e.identifier); - } - } - - private addInstallingExtension(extension: IExtensionIdentifier) { - this.removeInstallingExtension(extension); - this.installingExtensions.push(extension); - } - - private removeInstallingExtension(identifier: IExtensionIdentifier) { - this.installingExtensions = this.installingExtensions.filter(e => !areSameExtensions(e, identifier)); - } - - private addInstalledExtension(extension: IExtensionIdentifier): void { - if (this.installedExtensions) { - this.removeInstalledExtension(extension); - this.installedExtensions.push(extension); - } - } - - private removeInstalledExtension(identifier: IExtensionIdentifier): void { - if (this.installedExtensions) { - this.installedExtensions = this.installedExtensions.filter(e => !areSameExtensions(e, identifier)); - } - } - private async onDidChange(): Promise { - if (this.installedExtensions) { - const extensions = await this.extensionsManagementService.getInstalled(); - const added = extensions.filter(e => { - if ([...this.installingExtensions, ...this.installedExtensions!].some(identifier => areSameExtensions(identifier, e.identifier))) { - return false; - } - if (e.installedTimestamp && e.installedTimestamp > this.startTimestamp) { - this.logService.info('Detected extension installed from another source', e.identifier.id); - return true; - } else { - this.logService.info('Ignored extension installed by another source because of invalid timestamp', e.identifier.id); - return false; - } - }); - const removed = this.installedExtensions.filter(identifier => { - // Extension being installed - if (this.installingExtensions.some(installingExtension => areSameExtensions(installingExtension, identifier))) { - return false; - } - if (extensions.every(e => !areSameExtensions(e.identifier, identifier))) { - this.logService.info('Detected extension removed from another source', identifier.id); - return true; - } + const installed = await this.extensionManagementService.getAllUserInstalled(); + const added = installed.filter(e => { + if (e.installedTimestamp !== undefined) { return false; + } + if (this.profileExtensionsLocations.has(this.getKey(e.identifier, e.manifest.version))) { + return false; + } + this.logService.info('Detected extension installed from another source', e.identifier.id); + return true; + }); + if (added.length) { + await this.extensionsProfileScannerService.addExtensionsToProfile(added.map(e => [e, undefined]), this.userDataProfilesService.defaultProfile.extensionsResource); + this._onDidChangeExtensionsByAnotherSource.fire({ + added: added.map(local => ({ + identifier: local.identifier, + operation: InstallOperation.None, + profileLocation: this.userDataProfilesService.defaultProfile.extensionsResource, + local + })), + removed: [] }); - this.installedExtensions = extensions.map(e => e.identifier); - if (added.length || removed.length) { - this._onDidChangeExtensionsByAnotherSource.fire({ added, removed }); + } + } + + private async onDidChangeProfiles(added: readonly IUserDataProfile[], removed: readonly IUserDataProfile[]): Promise { + try { + await Promise.all(removed.map(profile => this.removeExtensionsFromProfile(profile.extensionsResource))); + } catch (error) { + this.logService.error(error); + } + + try { + if (added.length) { + await Promise.all(added.map(profile => this.populateExtensionsFromProfile(profile.extensionsResource))); + } + } catch (error) { + this.logService.error(error); + } + } + + private async uninstallExtensionsNotInProfiles(): Promise { + const installed = await this.extensionManagementService.getAllUserInstalled(); + const toUninstall = installed.filter(installedExtension => !this.profileExtensionsLocations.has(this.getKey(installedExtension.identifier, installedExtension.manifest.version))); + if (toUninstall.length) { + await this.extensionManagementService.markAsUninstalled(...toUninstall); + } + } + + private async onDidInstallExtensions(installedExtensions: readonly InstallExtensionResult[]): Promise { + for (const { local, profileLocation } of installedExtensions) { + if (!local || !profileLocation) { + continue; + } + this.addExtensionWithKey(this.getKey(local.identifier, local.manifest.version), profileLocation); + } + } + + private async onDidUninstallExtension(e: DidUninstallExtensionEvent): Promise { + if (!e.profileLocation || !e.version) { + return; + } + if (this.removeExtensionWithKey(this.getKey(e.identifier, e.version), e.profileLocation)) { + await this.uninstallExtensions([{ identifier: e.identifier, version: e.version }]); + } + } + + private async populateExtensionsFromProfile(extensionsProfileLocation: URI): Promise { + const extensions = await this.extensionsProfileScannerService.scanProfileExtensions(extensionsProfileLocation); + for (const extension of extensions) { + this.addExtensionWithKey(this.getKey(extension.identifier, extension.version), extensionsProfileLocation); + } + } + + private async removeExtensionsFromProfile(removedProfile: URI): Promise { + const extensionsToRemove: { identifier: IExtensionIdentifier; version: string }[] = []; + for (const key of [...this.profileExtensionsLocations.keys()]) { + if (!this.removeExtensionWithKey(key, removedProfile)) { + continue; + } + const extensionToRemove = this.fromKey(key); + if (extensionToRemove) { + extensionsToRemove.push(extensionToRemove); } } + if (extensionsToRemove.length) { + await this.uninstallExtensions(extensionsToRemove); + } + } + + private addExtensionWithKey(key: string, extensionsProfileLocation: URI): void { + let locations = this.profileExtensionsLocations.get(key); + if (!locations) { + locations = []; + this.profileExtensionsLocations.set(key, locations); + } + locations.push(extensionsProfileLocation); + } + + private removeExtensionWithKey(key: string, profileLocation: URI): boolean { + const profiles = this.profileExtensionsLocations.get(key); + if (profiles) { + const index = profiles.findIndex(profile => this.uriIdentityService.extUri.isEqual(profile, profileLocation)); + if (index > -1) { + profiles.splice(index, 1); + } + } + if (!profiles?.length) { + this.profileExtensionsLocations.delete(key); + return true; + } + return false; + } + + private async uninstallExtensions(extensionsToRemove: { identifier: IExtensionIdentifier; version: string }[]): Promise { + const installed = await this.extensionManagementService.getAllUserInstalled(); + const toUninstall = installed.filter(installedExtension => extensionsToRemove.some(e => this.getKey(installedExtension.identifier, installedExtension.manifest.version) === this.getKey(e.identifier, e.version))); + if (toUninstall.length) { + await this.extensionManagementService.markAsUninstalled(...toUninstall); + } + } + + private getKey(identifier: IExtensionIdentifier, version: string): string { + return `${ExtensionIdentifier.toKey(identifier.id)}@${version}`; + } + + private fromKey(key: string): { identifier: IExtensionIdentifier; version: string } | undefined { + const [id, version] = getIdAndVersion(key); + return version ? { identifier: { id }, version } : undefined; } } diff --git a/src/vs/platform/userDataProfile/browser/userDataProfile.ts b/src/vs/platform/userDataProfile/browser/userDataProfile.ts index 8d4253f2c88..a3144510cf6 100644 --- a/src/vs/platform/userDataProfile/browser/userDataProfile.ts +++ b/src/vs/platform/userDataProfile/browser/userDataProfile.ts @@ -16,7 +16,6 @@ type BroadcastedProfileChanges = UriDto>; export class BrowserUserDataProfilesService extends UserDataProfilesService implements IUserDataProfilesService { - protected override readonly defaultProfileShouldIncludeExtensionsResourceAlways: boolean = true; private readonly changesBroadcastChannel: BroadcastDataChannel; constructor( diff --git a/src/vs/platform/userDataProfile/common/userDataProfile.ts b/src/vs/platform/userDataProfile/common/userDataProfile.ts index 2207f1a08e4..b74d2b1cfde 100644 --- a/src/vs/platform/userDataProfile/common/userDataProfile.ts +++ b/src/vs/platform/userDataProfile/common/userDataProfile.ts @@ -7,7 +7,6 @@ import { hash } from 'vs/base/common/hash'; import { Emitter, Event } from 'vs/base/common/event'; import { Disposable } from 'vs/base/common/lifecycle'; import { basename, joinPath } from 'vs/base/common/resources'; -import { isUndefined } from 'vs/base/common/types'; import { URI, UriDto } from 'vs/base/common/uri'; import { localize } from 'vs/nls'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; @@ -45,7 +44,7 @@ export interface IUserDataProfile { readonly keybindingsResource: URI; readonly tasksResource: URI; readonly snippetsHome: URI; - readonly extensionsResource: URI | undefined; + readonly extensionsResource: URI; readonly useDefaultFlags?: UseDefaultProfileFlags; readonly isTransient?: boolean; } @@ -63,7 +62,7 @@ export function isUserDataProfile(thing: unknown): thing is IUserDataProfile { && URI.isUri(candidate.keybindingsResource) && URI.isUri(candidate.tasksResource) && URI.isUri(candidate.snippetsHome) - && (isUndefined(candidate.extensionsResource) || URI.isUri(candidate.extensionsResource)) + && URI.isUri(candidate.extensionsResource) ); } @@ -138,8 +137,6 @@ export function reviveProfile(profile: UriDto, scheme: string) }; } -export const EXTENSIONS_RESOURCE_NAME = 'extensions.json'; - export function toUserDataProfile(id: string, name: string, location: URI, options?: IUserDataProfileOptions): IUserDataProfile { return { id, @@ -152,7 +149,7 @@ export function toUserDataProfile(id: string, name: string, location: URI, optio keybindingsResource: joinPath(location, 'keybindings.json'), tasksResource: joinPath(location, 'tasks.json'), snippetsHome: joinPath(location, 'snippets'), - extensionsResource: joinPath(location, EXTENSIONS_RESOURCE_NAME), + extensionsResource: joinPath(location, 'extensions.json'), useDefaultFlags: options?.useDefaultFlags, isTransient: options?.transient }; @@ -184,7 +181,6 @@ export class UserDataProfilesService extends Disposable implements IUserDataProf readonly _serviceBrand: undefined; protected enabled: boolean = false; - protected readonly defaultProfileShouldIncludeExtensionsResourceAlways: boolean = false; readonly profilesHome: URI; get defaultProfile(): IUserDataProfile { return this.profiles[0]; } @@ -237,7 +233,7 @@ export class UserDataProfilesService extends Disposable implements IUserDataProf let emptyWindow: IUserDataProfile | undefined; const workspaces = new ResourceMap(); const defaultProfile = toUserDataProfile(hash(this.environmentService.userRoamingDataHome.path).toString(16), localize('defaultProfile', "Default"), this.environmentService.userRoamingDataHome); - profiles.unshift({ ...defaultProfile, isDefault: true, extensionsResource: this.defaultProfileShouldIncludeExtensionsResourceAlways || profiles.length > 0 || this.transientProfilesObject.profiles.length > 0 ? defaultProfile.extensionsResource : undefined }); + profiles.unshift({ ...defaultProfile, isDefault: true }); if (profiles.length) { const profileAssicaitions = this.getStoredProfileAssociations(); if (profileAssicaitions.workspaces) { diff --git a/src/vs/platform/userDataProfile/test/common/userDataProfileService.test.ts b/src/vs/platform/userDataProfile/test/common/userDataProfileService.test.ts index 80475cfdc10..e146018fb7c 100644 --- a/src/vs/platform/userDataProfile/test/common/userDataProfileService.test.ts +++ b/src/vs/platform/userDataProfile/test/common/userDataProfileService.test.ts @@ -54,13 +54,12 @@ suite('UserDataProfileService (Common)', () => { assert.strictEqual(testObject.defaultProfile.settingsResource.toString(), joinPath(environmentService.userRoamingDataHome, 'settings.json').toString()); assert.strictEqual(testObject.defaultProfile.snippetsHome.toString(), joinPath(environmentService.userRoamingDataHome, 'snippets').toString()); assert.strictEqual(testObject.defaultProfile.tasksResource.toString(), joinPath(environmentService.userRoamingDataHome, 'tasks.json').toString()); - assert.strictEqual(testObject.defaultProfile.extensionsResource, undefined); + assert.strictEqual(testObject.defaultProfile.extensionsResource.toString(), joinPath(environmentService.userRoamingDataHome, 'extensions.json').toString()); }); test('profiles always include default profile', () => { assert.deepStrictEqual(testObject.profiles.length, 1); assert.deepStrictEqual(testObject.profiles[0].isDefault, true); - assert.deepStrictEqual(testObject.profiles[0].extensionsResource, undefined); }); test('create profile with id', async () => { @@ -116,7 +115,6 @@ suite('UserDataProfileService (Common)', () => { assert.deepStrictEqual(testObject.profiles.length, 2); assert.deepStrictEqual(testObject.profiles[0].isDefault, true); - assert.deepStrictEqual(testObject.profiles[0].extensionsResource?.toString(), joinPath(environmentService.userRoamingDataHome, 'extensions.json').toString()); }); test('profiles include default profile with extension resource undefined when transiet prrofile is removed', async () => { @@ -125,7 +123,6 @@ suite('UserDataProfileService (Common)', () => { assert.deepStrictEqual(testObject.profiles.length, 1); assert.deepStrictEqual(testObject.profiles[0].isDefault, true); - assert.deepStrictEqual(testObject.profiles[0].extensionsResource, undefined); }); test('update named profile', async () => { diff --git a/src/vs/platform/userDataProfile/test/electron-main/userDataProfileMainService.test.ts b/src/vs/platform/userDataProfile/test/electron-main/userDataProfileMainService.test.ts index 7078f0757a4..ddca6884601 100644 --- a/src/vs/platform/userDataProfile/test/electron-main/userDataProfileMainService.test.ts +++ b/src/vs/platform/userDataProfile/test/electron-main/userDataProfileMainService.test.ts @@ -51,26 +51,22 @@ suite('UserDataProfileMainService', () => { test('default profile', () => { assert.strictEqual(testObject.defaultProfile.isDefault, true); - assert.strictEqual(testObject.defaultProfile.extensionsResource, undefined); }); test('profiles always include default profile', () => { assert.deepStrictEqual(testObject.profiles.length, 1); assert.deepStrictEqual(testObject.profiles[0].isDefault, true); - assert.deepStrictEqual(testObject.profiles[0].extensionsResource, undefined); }); test('default profile when there are profiles', async () => { await testObject.createNamedProfile('test'); assert.strictEqual(testObject.defaultProfile.isDefault, true); - assert.strictEqual(testObject.defaultProfile.extensionsResource?.toString(), joinPath(environmentService.userRoamingDataHome, 'extensions.json').toString()); }); test('default profile when profiles are removed', async () => { const profile = await testObject.createNamedProfile('test'); await testObject.removeProfile(profile); assert.strictEqual(testObject.defaultProfile.isDefault, true); - assert.strictEqual(testObject.defaultProfile.extensionsResource, undefined); }); }); diff --git a/src/vs/platform/userDataSync/common/extensionsSync.ts b/src/vs/platform/userDataSync/common/extensionsSync.ts index 87098ee8e71..4e61627c14d 100644 --- a/src/vs/platform/userDataSync/common/extensionsSync.ts +++ b/src/vs/platform/userDataSync/common/extensionsSync.ts @@ -113,7 +113,7 @@ export class ExtensionsSynchroniser extends AbstractSynchroniser implements IUse constructor( // profileLocation changes for default profile - public profile: IUserDataProfile, + profile: IUserDataProfile, collection: string | undefined, @IEnvironmentService environmentService: IEnvironmentService, @IFileService fileService: IFileService, @@ -147,7 +147,7 @@ export class ExtensionsSynchroniser extends AbstractSynchroniser implements IUse const builtinExtensions: IExtensionIdentifier[] = lastSyncUserData?.builtinExtensions || []; const lastSyncExtensions: ISyncExtension[] | null = lastSyncUserData?.syncData ? await parseAndMigrateExtensions(lastSyncUserData.syncData, this.extensionManagementService) : null; - const { localExtensions, ignoredExtensions } = await this.localExtensionsProvider.getLocalExtensions(this.profile); + const { localExtensions, ignoredExtensions } = await this.localExtensionsProvider.getLocalExtensions(this.syncResource.profile); if (remoteExtensions) { this.logService.trace(`${this.syncResourceLogLabel}: Merging remote extensions with local extensions...`); @@ -185,7 +185,7 @@ export class ExtensionsSynchroniser extends AbstractSynchroniser implements IUse protected async hasRemoteChanged(lastSyncUserData: ILastSyncUserData): Promise { const lastSyncExtensions: ISyncExtension[] | null = lastSyncUserData.syncData ? await parseAndMigrateExtensions(lastSyncUserData.syncData, this.extensionManagementService) : null; - const { localExtensions, ignoredExtensions } = await this.localExtensionsProvider.getLocalExtensions(this.profile); + const { localExtensions, ignoredExtensions } = await this.localExtensionsProvider.getLocalExtensions(this.syncResource.profile); const { remote } = merge(localExtensions, lastSyncExtensions, lastSyncExtensions, lastSyncUserData.skippedExtensions || [], ignoredExtensions, lastSyncUserData.builtinExtensions || []); return remote !== null; } @@ -239,7 +239,7 @@ export class ExtensionsSynchroniser extends AbstractSynchroniser implements IUse } private async acceptLocal(resourcePreview: IExtensionResourcePreview): Promise { - const installedExtensions = await this.extensionManagementService.getInstalled(undefined, this.profile.location); + const installedExtensions = await this.extensionManagementService.getInstalled(undefined, this.syncResource.profile.extensionsResource); const ignoredExtensions = this.ignoredExtensionsManagementService.getIgnoredExtensions(installedExtensions); const mergeResult = merge(resourcePreview.localExtensions, null, null, resourcePreview.skippedExtensions, ignoredExtensions, resourcePreview.builtinExtensions); const { local, remote } = mergeResult; @@ -253,7 +253,7 @@ export class ExtensionsSynchroniser extends AbstractSynchroniser implements IUse } private async acceptRemote(resourcePreview: IExtensionResourcePreview): Promise { - const installedExtensions = await this.extensionManagementService.getInstalled(undefined, this.profile.location); + const installedExtensions = await this.extensionManagementService.getInstalled(undefined, this.syncResource.profile.extensionsResource); const ignoredExtensions = this.ignoredExtensionsManagementService.getIgnoredExtensions(installedExtensions); const remoteExtensions = resourcePreview.remoteContent ? JSON.parse(resourcePreview.remoteContent) : null; if (remoteExtensions !== null) { @@ -287,7 +287,7 @@ export class ExtensionsSynchroniser extends AbstractSynchroniser implements IUse if (localChange !== Change.None) { await this.backupLocal(JSON.stringify(localExtensions)); - skippedExtensions = await this.localExtensionsProvider.updateLocalExtensions(local.added, local.removed, local.updated, skippedExtensions, this.profile); + skippedExtensions = await this.localExtensionsProvider.updateLocalExtensions(local.added, local.removed, local.updated, skippedExtensions, this.syncResource.profile); } if (remote) { @@ -325,7 +325,7 @@ export class ExtensionsSynchroniser extends AbstractSynchroniser implements IUse async hasLocalData(): Promise { try { - const { localExtensions } = await this.localExtensionsProvider.getLocalExtensions(this.profile); + const { localExtensions } = await this.localExtensionsProvider.getLocalExtensions(this.syncResource.profile); if (localExtensions.some(e => e.installed || e.disabled)) { return true; } diff --git a/src/vs/platform/userDataSync/common/userDataProfilesManifestSync.ts b/src/vs/platform/userDataSync/common/userDataProfilesManifestSync.ts index 4d3767d988d..8be70621bfd 100644 --- a/src/vs/platform/userDataSync/common/userDataProfilesManifestSync.ts +++ b/src/vs/platform/userDataSync/common/userDataProfilesManifestSync.ts @@ -180,15 +180,27 @@ export class UserDataProfilesManifestSynchroniser extends AbstractSynchroniser i await this.backupLocal(stringifyLocalProfiles(this.getLocalUserDataProfiles(), false)); const promises: Promise[] = []; for (const profile of local.added) { - promises.push(this.userDataProfilesService.createProfile(profile.id, profile.name, { shortName: profile.shortName })); + promises.push((async () => { + this.logService.trace(`${this.syncResourceLogLabel}: Creating '${profile.name}' profile...`); + await this.userDataProfilesService.createProfile(profile.id, profile.name, { shortName: profile.shortName }); + this.logService.info(`${this.syncResourceLogLabel}: Created profile '${profile.name}'.`); + })()); } for (const profile of local.removed) { - promises.push(this.userDataProfilesService.removeProfile(profile)); + promises.push((async () => { + this.logService.trace(`${this.syncResourceLogLabel}: Removing '${profile.name}' profile...`); + await this.userDataProfilesService.removeProfile(profile); + this.logService.info(`${this.syncResourceLogLabel}: Removed profile '${profile.name}'.`); + })()); } for (const profile of local.updated) { const localProfile = this.userDataProfilesService.profiles.find(p => p.id === profile.id); if (localProfile) { - promises.push(this.userDataProfilesService.updateProfile(localProfile, { name: profile.name, shortName: profile.shortName })); + promises.push((async () => { + this.logService.trace(`${this.syncResourceLogLabel}: Updating '${profile.name}' profile...`); + await this.userDataProfilesService.updateProfile(localProfile, { name: profile.name, shortName: profile.shortName }); + this.logService.info(`${this.syncResourceLogLabel}: Updated profile '${profile.name}'.`); + })()); } else { this.logService.info(`${this.syncResourceLogLabel}: Could not find profile with id '${profile.id}' to update.`); } diff --git a/src/vs/platform/userDataSync/common/userDataSyncService.ts b/src/vs/platform/userDataSync/common/userDataSyncService.ts index ab5261c5cc3..2741e974dd2 100644 --- a/src/vs/platform/userDataSync/common/userDataSyncService.ts +++ b/src/vs/platform/userDataSync/common/userDataSyncService.ts @@ -542,19 +542,6 @@ class ProfileSynchronizer extends Disposable { @IEnvironmentService private readonly environmentService: IEnvironmentService, ) { super(); - if (this._profile.isDefault) { - this._register(userDataProfilesService.onDidChangeProfiles(() => { - if ((userDataProfilesService.defaultProfile.extensionsResource && !this._profile.extensionsResource) || - (!userDataProfilesService.defaultProfile.extensionsResource && this._profile.extensionsResource)) { - this._profile = userDataProfilesService.defaultProfile; - for (const [synchronizer] of this._enabled) { - if (synchronizer instanceof ExtensionsSynchroniser) { - synchronizer.profile = this._profile; - } - } - } - })); - } this._register(userDataSyncEnablementService.onDidChangeResourceEnablement(([syncResource, enablement]) => this.onDidChangeResourceEnablement(syncResource, enablement))); this._register(toDisposable(() => this._enabled.splice(0, this._enabled.length).forEach(([, , disposable]) => disposable.dispose()))); for (const syncResource of ALL_SYNC_RESOURCES) { diff --git a/src/vs/server/node/remoteAgentEnvironmentImpl.ts b/src/vs/server/node/remoteAgentEnvironmentImpl.ts index 7f581f36ea5..f16217b0125 100644 --- a/src/vs/server/node/remoteAgentEnvironmentImpl.ts +++ b/src/vs/server/node/remoteAgentEnvironmentImpl.ts @@ -29,6 +29,7 @@ import { IExtensionsScannerService, toExtensionDescription } from 'vs/platform/e import { dedupExtensions } from 'vs/workbench/services/extensions/common/extensionsUtil'; import { IUserDataProfilesService } from 'vs/platform/userDataProfile/common/userDataProfile'; import { ExtensionManagementCLI } from 'vs/platform/extensionManagement/common/extensionManagementCLI'; +import { INativeServerExtensionManagementService } from 'vs/platform/extensionManagement/node/extensionManagementService'; export class RemoteAgentEnvironmentChannel implements IServerChannel { @@ -44,6 +45,7 @@ export class RemoteAgentEnvironmentChannel implements IServerChannel { private readonly _logService: ILogService, private readonly _extensionHostStatusService: IExtensionHostStatusService, private readonly _extensionsScannerService: IExtensionsScannerService, + private readonly _extensionManagementService: INativeServerExtensionManagementService, ) { if (_environmentService.args['install-builtin-extension']) { const installOptions: InstallOptions = { isMachineScoped: !!_environmentService.args['do-not-sync'], installPreReleaseVersion: !!_environmentService.args['pre-release'] }; @@ -334,6 +336,7 @@ export class RemoteAgentEnvironmentChannel implements IServerChannel { } private async _scanInstalledExtensions(language: string): Promise { + await this._extensionManagementService.migrateDefaultProfileExtensions(); const scannedExtensions = await this._extensionsScannerService.scanUserExtensions({ language, useCache: true }); return scannedExtensions.map(e => toExtensionDescription(e, false)); } diff --git a/src/vs/server/node/serverServices.ts b/src/vs/server/node/serverServices.ts index 6978f8f6e4f..9d94002e098 100644 --- a/src/vs/server/node/serverServices.ts +++ b/src/vs/server/node/serverServices.ts @@ -196,7 +196,7 @@ export async function setupServerServices(connectionToken: ServerConnectionToken instantiationService.invokeFunction(accessor => { const extensionManagementService = accessor.get(INativeServerExtensionManagementService); const extensionsScannerService = accessor.get(IExtensionsScannerService); - const remoteExtensionEnvironmentChannel = new RemoteAgentEnvironmentChannel(connectionToken, environmentService, userDataProfilesService, instantiationService.createInstance(ExtensionManagementCLI), logService, extensionHostStatusService, extensionsScannerService); + const remoteExtensionEnvironmentChannel = new RemoteAgentEnvironmentChannel(connectionToken, environmentService, userDataProfilesService, instantiationService.createInstance(ExtensionManagementCLI), logService, extensionHostStatusService, extensionsScannerService, extensionManagementService); socketServer.registerChannel('remoteextensionsenvironment', remoteExtensionEnvironmentChannel); const telemetryChannel = new ServerTelemetryChannel(accessor.get(IServerTelemetryService), oneDsAppender); @@ -219,7 +219,7 @@ export async function setupServerServices(connectionToken: ServerConnectionToken socketServer.registerChannel('credentials', credentialsChannel); // clean up deprecated extensions - extensionManagementService.removeUninstalledExtensions(true); + extensionManagementService.removeUninstalledExtensions(); disposables.add(new ErrorTelemetry(accessor.get(ITelemetryService))); diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts b/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts index 3569cdb1657..7c0e6f44ab8 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts @@ -2501,6 +2501,7 @@ export class ReinstallAction extends Action { constructor( id: string = ReinstallAction.ID, label: string = ReinstallAction.LABEL, @IExtensionsWorkbenchService private readonly extensionsWorkbenchService: IExtensionsWorkbenchService, + @IExtensionManagementServerService private readonly extensionManagementServerService: IExtensionManagementServerService, @IQuickInputService private readonly quickInputService: IQuickInputService, @INotificationService private readonly notificationService: INotificationService, @IHostService private readonly hostService: IHostService, @@ -2523,7 +2524,7 @@ export class ReinstallAction extends Action { return this.extensionsWorkbenchService.queryLocal() .then(local => { const entries = local - .filter(extension => !extension.isBuiltin) + .filter(extension => !extension.isBuiltin && extension.server !== this.extensionManagementServerService.webExtensionManagementServer) .map(extension => { return { id: extension.identifier.id, diff --git a/src/vs/workbench/services/extensionManagement/browser/webExtensionsScannerService.ts b/src/vs/workbench/services/extensionManagement/browser/webExtensionsScannerService.ts index 905f49db4de..abf7fbbcd96 100644 --- a/src/vs/workbench/services/extensionManagement/browser/webExtensionsScannerService.ts +++ b/src/vs/workbench/services/extensionManagement/browser/webExtensionsScannerService.ts @@ -371,7 +371,7 @@ export class WebExtensionsScannerService extends Disposable implements IWebExten return this.readSystemExtensions(); } - async scanUserExtensions(profileLocation?: URI, scanOptions?: ScanOptions): Promise { + async scanUserExtensions(profileLocation: URI, scanOptions?: ScanOptions): Promise { const extensions = new Map(); // Custom builtin extensions defined through `additionalBuiltinExtensions` API @@ -410,7 +410,7 @@ export class WebExtensionsScannerService extends Disposable implements IWebExten return result; } - async scanExistingExtension(extensionLocation: URI, extensionType: ExtensionType, profileLocation?: URI): Promise { + async scanExistingExtension(extensionLocation: URI, extensionType: ExtensionType, profileLocation: URI): Promise { if (extensionType === ExtensionType.System) { const systemExtensions = await this.scanSystemExtensions(); return systemExtensions.find(e => e.location.toString() === extensionLocation.toString()) || null; @@ -419,7 +419,7 @@ export class WebExtensionsScannerService extends Disposable implements IWebExten return userExtensions.find(e => e.location.toString() === extensionLocation.toString()) || null; } - async scanMetadata(extensionLocation: URI, profileLocation?: URI): Promise { + async scanMetadata(extensionLocation: URI, profileLocation: URI): Promise { const extension = await this.scanExistingExtension(extensionLocation, ExtensionType.User, profileLocation); return extension?.metadata; } @@ -437,19 +437,19 @@ export class WebExtensionsScannerService extends Disposable implements IWebExten return null; } - async addExtensionFromGallery(galleryExtension: IGalleryExtension, metadata: Metadata, profileLocation?: URI): Promise { + async addExtensionFromGallery(galleryExtension: IGalleryExtension, metadata: Metadata, profileLocation: URI): Promise { const webExtension = await this.toWebExtensionFromGallery(galleryExtension, metadata); return this.addWebExtension(webExtension, profileLocation); } - async addExtension(location: URI, metadata: Metadata, profileLocation?: URI): Promise { + async addExtension(location: URI, metadata: Metadata, profileLocation: URI): Promise { const webExtension = await this.toWebExtension(location, undefined, undefined, undefined, undefined, undefined, undefined, metadata); const extension = await this.toScannedExtension(webExtension, false); await this.addToInstalledExtensions([webExtension], profileLocation); return extension; } - async removeExtension(extension: IScannedExtension, profileLocation?: URI): Promise { + async removeExtension(extension: IScannedExtension, profileLocation: URI): Promise { await this.writeInstalledExtensions(profileLocation, installedExtensions => installedExtensions.filter(installedExtension => !areSameExtensions(installedExtension.identifier, extension.identifier))); } @@ -467,7 +467,7 @@ export class WebExtensionsScannerService extends Disposable implements IWebExten } } - private async addWebExtension(webExtension: IWebExtension, profileLocation?: URI): Promise { + private async addWebExtension(webExtension: IWebExtension, profileLocation: URI): Promise { const isSystem = !!(await this.scanSystemExtensions()).find(e => areSameExtensions(e.identifier, webExtension.identifier)); const isBuiltin = !!webExtension.metadata?.isBuiltin; const extension = await this.toScannedExtension(webExtension, isBuiltin); @@ -504,7 +504,7 @@ export class WebExtensionsScannerService extends Disposable implements IWebExten return extension; } - private async addToInstalledExtensions(webExtensions: IWebExtension[], profileLocation?: URI): Promise { + private async addToInstalledExtensions(webExtensions: IWebExtension[], profileLocation: URI): Promise { await this.writeInstalledExtensions(profileLocation, installedExtensions => { // Remove the existing extension to avoid duplicates installedExtensions = installedExtensions.filter(installedExtension => webExtensions.some(extension => !areSameExtensions(installedExtension.identifier, extension.identifier))); @@ -513,11 +513,11 @@ export class WebExtensionsScannerService extends Disposable implements IWebExten }); } - private async scanInstalledExtensions(profileLocation?: URI, scanOptions?: ScanOptions): Promise { + private async scanInstalledExtensions(profileLocation: URI, scanOptions?: ScanOptions): Promise { let installedExtensions = await this.readInstalledExtensions(profileLocation); // If current profile is not a default profile, then add the application extensions to the list - if (this.userDataProfilesService.defaultProfile.extensionsResource && !this.uriIdentityService.extUri.isEqual(profileLocation, this.userDataProfilesService.defaultProfile.extensionsResource)) { + if (!this.uriIdentityService.extUri.isEqual(profileLocation, this.userDataProfilesService.defaultProfile.extensionsResource)) { // Remove application extensions from the non default profile installedExtensions = installedExtensions.filter(i => !i.metadata?.isApplicationScoped); // Add application extensions from the default profile to the list @@ -764,14 +764,14 @@ export class WebExtensionsScannerService extends Disposable implements IWebExten return this._migratePackageNLSUrisPromise; } - private async readInstalledExtensions(profileLocation?: URI): Promise { + private async readInstalledExtensions(profileLocation: URI): Promise { if (this.uriIdentityService.extUri.isEqual(profileLocation, this.userDataProfilesService.defaultProfile.extensionsResource)) { await this.migratePackageNLSUris(); } return this.withWebExtensions(profileLocation); } - private writeInstalledExtensions(profileLocation: URI | undefined, updateFn: (extensions: IWebExtension[]) => IWebExtension[]): Promise { + private writeInstalledExtensions(profileLocation: URI, updateFn: (extensions: IWebExtension[]) => IWebExtension[]): Promise { return this.withWebExtensions(profileLocation, updateFn); } diff --git a/src/vs/workbench/services/extensionManagement/common/extensionManagement.ts b/src/vs/workbench/services/extensionManagement/common/extensionManagement.ts index 34d4367b525..aecd0f677db 100644 --- a/src/vs/workbench/services/extensionManagement/common/extensionManagement.ts +++ b/src/vs/workbench/services/extensionManagement/common/extensionManagement.ts @@ -167,15 +167,15 @@ export interface IWebExtensionsScannerService { readonly _serviceBrand: undefined; scanSystemExtensions(): Promise; - scanUserExtensions(profileLocation: URI | undefined, options?: ScanOptions): Promise; + scanUserExtensions(profileLocation: URI, options?: ScanOptions): Promise; scanExtensionsUnderDevelopment(): Promise; - scanExistingExtension(extensionLocation: URI, extensionType: ExtensionType, profileLocation: URI | undefined): Promise; + scanExistingExtension(extensionLocation: URI, extensionType: ExtensionType, profileLocation: URI): Promise; - addExtension(location: URI, metadata: Metadata, profileLocation: URI | undefined): Promise; - addExtensionFromGallery(galleryExtension: IGalleryExtension, metadata: Metadata, profileLocation: URI | undefined): Promise; - removeExtension(extension: IScannedExtension, profileLocation: URI | undefined): Promise; + addExtension(location: URI, metadata: Metadata, profileLocation: URI): Promise; + addExtensionFromGallery(galleryExtension: IGalleryExtension, metadata: Metadata, profileLocation: URI): Promise; + removeExtension(extension: IScannedExtension, profileLocation: URI): Promise; copyExtensions(fromProfileLocation: URI, toProfileLocation: URI, filter: (extension: IScannedExtension) => boolean): Promise; - scanMetadata(extensionLocation: URI, profileLocation: URI | undefined): Promise; + scanMetadata(extensionLocation: URI, profileLocation: URI): Promise; scanExtensionManifest(extensionLocation: URI): Promise; } diff --git a/src/vs/workbench/services/extensionManagement/common/webExtensionManagementService.ts b/src/vs/workbench/services/extensionManagement/common/webExtensionManagementService.ts index 79333395143..0deec1d3631 100644 --- a/src/vs/workbench/services/extensionManagement/common/webExtensionManagementService.ts +++ b/src/vs/workbench/services/extensionManagement/common/webExtensionManagementService.ts @@ -4,14 +4,14 @@ *--------------------------------------------------------------------------------------------*/ import { ExtensionIdentifier, ExtensionType, IExtension, IExtensionIdentifier, IExtensionManifest, TargetPlatform } from 'vs/platform/extensions/common/extensions'; -import { ILocalExtension, IGalleryExtension, IGalleryMetadata, InstallOperation, IExtensionGalleryService, Metadata, InstallOptions, UninstallOptions } from 'vs/platform/extensionManagement/common/extensionManagement'; +import { ILocalExtension, IGalleryExtension, IGalleryMetadata, InstallOperation, IExtensionGalleryService, Metadata, InstallOptions } from 'vs/platform/extensionManagement/common/extensionManagement'; import { URI } from 'vs/base/common/uri'; import { Emitter, Event } from 'vs/base/common/event'; import { areSameExtensions, getGalleryExtensionId } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { IProfileAwareExtensionManagementService, IScannedExtension, IWebExtensionsScannerService } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; import { ILogService } from 'vs/platform/log/common/log'; import { CancellationToken } from 'vs/base/common/cancellation'; -import { AbstractExtensionManagementService, AbstractExtensionTask, IInstallExtensionTask, IUninstallExtensionTask } from 'vs/platform/extensionManagement/common/abstractExtensionManagementService'; +import { AbstractExtensionManagementService, AbstractExtensionTask, IInstallExtensionTask, InstallExtensionTaskOptions, IUninstallExtensionTask, UninstallExtensionTaskOptions } from 'vs/platform/extensionManagement/common/abstractExtensionManagementService'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IExtensionManifestPropertiesService } from 'vs/workbench/services/extensions/common/extensionManifestPropertiesService'; import { IProductService } from 'vs/platform/product/common/productService'; @@ -129,17 +129,11 @@ export class WebExtensionManagementService extends AbstractExtensionManagementSe return local; } - protected doCreateInstallExtensionTask(manifest: IExtensionManifest, extension: URI | IGalleryExtension, options: InstallOptions): IInstallExtensionTask { - if (!options.profileLocation) { - options = { ...options, profileLocation: this.userDataProfileService.currentProfile.extensionsResource }; - } + protected createInstallExtensionTask(manifest: IExtensionManifest, extension: URI | IGalleryExtension, options: InstallExtensionTaskOptions): IInstallExtensionTask { return new InstallExtensionTask(manifest, extension, options, this.webExtensionsScannerService); } - protected doCreateUninstallExtensionTask(extension: ILocalExtension, options: UninstallOptions): IUninstallExtensionTask { - if (!options.profileLocation) { - options = { ...options, profileLocation: this.userDataProfileService.currentProfile.extensionsResource }; - } + protected createUninstallExtensionTask(extension: ILocalExtension, options: UninstallExtensionTaskOptions): IUninstallExtensionTask { return new UninstallExtensionTask(extension, options, this.webExtensionsScannerService); } @@ -148,6 +142,7 @@ export class WebExtensionManagementService extends AbstractExtensionManagementSe getManifest(vsix: URI): Promise { throw new Error('unsupported'); } updateExtensionScope(): Promise { throw new Error('unsupported'); } download(): Promise { throw new Error('unsupported'); } + reinstallFromGallery(): Promise { throw new Error('unsupported'); } private async whenProfileChanged(e: DidChangeUserDataProfileEvent): Promise { const previousProfileLocation = e.previous.extensionsResource; @@ -202,7 +197,7 @@ class InstallExtensionTask extends AbstractExtensionTask<{ local: ILocalExtensio constructor( manifest: IExtensionManifest, private readonly extension: URI | IGalleryExtension, - private readonly options: InstallOptions, + private readonly options: InstallExtensionTaskOptions, private readonly webExtensionsScannerService: IWebExtensionsScannerService, ) { super(); @@ -243,7 +238,7 @@ class UninstallExtensionTask extends AbstractExtensionTask implements IUni constructor( readonly extension: ILocalExtension, - private readonly options: UninstallOptions, + private readonly options: UninstallExtensionTaskOptions, private readonly webExtensionsScannerService: IWebExtensionsScannerService, ) { super(); diff --git a/src/vs/workbench/services/extensionManagement/electron-sandbox/nativeExtensionManagementService.ts b/src/vs/workbench/services/extensionManagement/electron-sandbox/nativeExtensionManagementService.ts index da1f95ec42e..6d2bf5f714b 100644 --- a/src/vs/workbench/services/extensionManagement/electron-sandbox/nativeExtensionManagementService.ts +++ b/src/vs/workbench/services/extensionManagement/electron-sandbox/nativeExtensionManagementService.ts @@ -15,7 +15,6 @@ import { delta } from 'vs/base/common/arrays'; import { compare } from 'vs/base/common/strings'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { DidChangeUserDataProfileEvent, IUserDataProfileService } from 'vs/workbench/services/userDataProfile/common/userDataProfile'; -import { EXTENSIONS_RESOURCE_NAME } from 'vs/platform/userDataProfile/common/userDataProfile'; import { joinPath } from 'vs/base/common/resources'; import { IExtensionsProfileScannerService } from 'vs/platform/extensionManagement/common/extensionsProfileScannerService'; import { Schemas } from 'vs/base/common/network'; @@ -106,8 +105,7 @@ export class NativeExtensionManagementService extends ExtensionManagementChannel } private async whenProfileChanged(e: DidChangeUserDataProfileEvent): Promise { - const previousExtensionsResource = e.previous.extensionsResource ?? joinPath(e.previous.location, EXTENSIONS_RESOURCE_NAME); - const oldExtensions = await super.getInstalled(ExtensionType.User, previousExtensionsResource); + const oldExtensions = await super.getInstalled(ExtensionType.User, e.previous.extensionsResource); if (e.preserveData) { const extensions: [ILocalExtension, Metadata | undefined][] = await Promise.all(oldExtensions .filter(e => !e.isApplicationScoped) /* remove application scoped extensions */ diff --git a/src/vs/workbench/services/extensions/electron-sandbox/cachedExtensionScanner.ts b/src/vs/workbench/services/extensions/electron-sandbox/cachedExtensionScanner.ts index dd9be154068..b2a8611aec9 100644 --- a/src/vs/workbench/services/extensions/electron-sandbox/cachedExtensionScanner.ts +++ b/src/vs/workbench/services/extensions/electron-sandbox/cachedExtensionScanner.ts @@ -16,6 +16,9 @@ import { INotificationService } from 'vs/platform/notification/common/notificati import { IHostService } from 'vs/workbench/services/host/browser/host'; import { timeout } from 'vs/base/common/async'; import { IUserDataProfileService } from 'vs/workbench/services/userDataProfile/common/userDataProfile'; +import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; +import { DEFAULT_PROFILE_EXTENSIONS_MIGRATION_KEY } from 'vs/platform/extensionManagement/common/extensionManagement'; +import { IUserDataProfilesService } from 'vs/platform/userDataProfile/common/userDataProfile'; export class CachedExtensionScanner { @@ -28,6 +31,8 @@ export class CachedExtensionScanner { @IHostService private readonly _hostService: IHostService, @IExtensionsScannerService private readonly _extensionsScannerService: IExtensionsScannerService, @IUserDataProfileService private readonly _userDataProfileService: IUserDataProfileService, + @IUserDataProfilesService private readonly _userDataProfilesService: IUserDataProfilesService, + @IStorageService private readonly _storageService: IStorageService, @ILogService private readonly _logService: ILogService, ) { this.scannedExtensions = new Promise((resolve, reject) => { @@ -53,9 +58,10 @@ export class CachedExtensionScanner { private async _scanInstalledExtensions(): Promise { try { const language = platform.language; + const profileLocation = this._userDataProfilesService.profiles.length === 1 && this._userDataProfileService.currentProfile.isDefault && !this._storageService.getBoolean(DEFAULT_PROFILE_EXTENSIONS_MIGRATION_KEY, StorageScope.APPLICATION, false) ? undefined : this._userDataProfileService.currentProfile.extensionsResource; const [scannedSystemExtensions, scannedUserExtensions] = await Promise.all([ this._extensionsScannerService.scanSystemExtensions({ language, useCache: true, checkControlFile: true }), - this._extensionsScannerService.scanUserExtensions({ language, profileLocation: this._userDataProfileService.currentProfile.extensionsResource, useCache: true })]); + this._extensionsScannerService.scanUserExtensions({ language, profileLocation, useCache: true })]); const scannedDevelopedExtensions = await this._extensionsScannerService.scanExtensionsUnderDevelopment({ language }, [...scannedSystemExtensions, ...scannedUserExtensions]); const system = scannedSystemExtensions.map(e => toExtensionDescription(e, false)); const user = scannedUserExtensions.map(e => toExtensionDescription(e, false)); diff --git a/src/vs/workbench/services/userDataProfile/common/userDataProfileService.ts b/src/vs/workbench/services/userDataProfile/common/userDataProfileService.ts index 63b78ba06b7..2f2f2c8a1fc 100644 --- a/src/vs/workbench/services/userDataProfile/common/userDataProfileService.ts +++ b/src/vs/workbench/services/userDataProfile/common/userDataProfileService.ts @@ -34,15 +34,6 @@ export class UserDataProfileService extends Disposable implements IUserDataProfi super(); this._currentProfile = currentProfile; this._register(userDataProfilesService.onDidChangeProfiles(e => { - /** - * If the current profile is default profile, then reset it because, - * In Desktop the extensions resource will be set/unset in the default profile when profiles are changed. - */ - if (this._currentProfile.isDefault) { - this._currentProfile = userDataProfilesService.defaultProfile; - return; - } - const updatedCurrentProfile = e.updated.find(p => this._currentProfile.id === p.id); if (updatedCurrentProfile) { this._currentProfile = updatedCurrentProfile; diff --git a/src/vs/workbench/test/electron-browser/workbenchTestServices.ts b/src/vs/workbench/test/electron-browser/workbenchTestServices.ts index ebec1acd03c..4b09620745a 100644 --- a/src/vs/workbench/test/electron-browser/workbenchTestServices.ts +++ b/src/vs/workbench/test/electron-browser/workbenchTestServices.ts @@ -68,7 +68,7 @@ const NULL_PROFILE = { keybindingsResource: joinPath(URI.file(homeDir), 'keybindings.json'), tasksResource: joinPath(URI.file(homeDir), 'tasks.json'), snippetsHome: joinPath(URI.file(homeDir), 'snippets'), - extensionsResource: undefined + extensionsResource: joinPath(URI.file(homeDir), 'extensions.json') }; export const TestNativeWindowConfiguration: INativeWindowConfiguration = { From b3523bc5ca1d5a40dd7f53acf331867af54b94be Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 3 Nov 2022 13:35:34 +0100 Subject: [PATCH 071/185] joh/external marlin (#165336) * move typeHierarchyPeek onto CSS variables * move symbolIcons onto CSS variables * move markerHoverParticipant onto CSS variables --- src/vs/base/browser/ui/hover/hover.css | 5 + .../hover/browser/markerHoverParticipant.ts | 13 -- .../symbolIcons/browser/symbolIcons.css | 39 ++++ .../symbolIcons/browser/symbolIcons.ts | 172 +----------------- .../browser/media/typeHierarchy.css | 25 +++ .../browser/typeHierarchyPeek.ts | 46 +---- 6 files changed, 71 insertions(+), 229 deletions(-) create mode 100644 src/vs/editor/contrib/symbolIcons/browser/symbolIcons.css diff --git a/src/vs/base/browser/ui/hover/hover.css b/src/vs/base/browser/ui/hover/hover.css index c24fe23a8ca..a6e7e298548 100644 --- a/src/vs/base/browser/ui/hover/hover.css +++ b/src/vs/base/browser/ui/hover/hover.css @@ -137,6 +137,11 @@ /** Hack to force underline to show **/ border-bottom: 1px solid transparent; text-underline-position: under; + color: var(--vscode-textLink-foreground); +} + +.monaco-hover .hover-contents a.code-link > span:hover { + color: var(--vscode-textLink-activeForeground); } /** Spans in markdown hovers need a margin-bottom to avoid looking cramped: https://github.com/microsoft/vscode/issues/101496 **/ diff --git a/src/vs/editor/contrib/hover/browser/markerHoverParticipant.ts b/src/vs/editor/contrib/hover/browser/markerHoverParticipant.ts index 492604659fb..7b156b6fc8f 100644 --- a/src/vs/editor/contrib/hover/browser/markerHoverParticipant.ts +++ b/src/vs/editor/contrib/hover/browser/markerHoverParticipant.ts @@ -25,8 +25,6 @@ import { ITextEditorOptions } from 'vs/platform/editor/common/editor'; import { IMarker, IMarkerData, MarkerSeverity } from 'vs/platform/markers/common/markers'; import { IOpenerService } from 'vs/platform/opener/common/opener'; import { Progress } from 'vs/platform/progress/common/progress'; -import { textLinkActiveForeground, textLinkForeground } from 'vs/platform/theme/common/colorRegistry'; -import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'; const $ = dom.$; @@ -253,14 +251,3 @@ export class MarkerHoverParticipant implements IEditorHoverParticipant { - const linkFg = theme.getColor(textLinkForeground); - if (linkFg) { - collector.addRule(`.monaco-hover .hover-contents a.code-link span { color: ${linkFg}; }`); - } - const activeLinkFg = theme.getColor(textLinkActiveForeground); - if (activeLinkFg) { - collector.addRule(`.monaco-hover .hover-contents a.code-link span:hover { color: ${activeLinkFg}; }`); - } -}); diff --git a/src/vs/editor/contrib/symbolIcons/browser/symbolIcons.css b/src/vs/editor/contrib/symbolIcons/browser/symbolIcons.css new file mode 100644 index 00000000000..bdced2def71 --- /dev/null +++ b/src/vs/editor/contrib/symbolIcons/browser/symbolIcons.css @@ -0,0 +1,39 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +.codicon.codicon-symbol-array { color: var(--vscode-symbolIcon-arrayForeground); } +.codicon.codicon-symbol-boolean { color: var(--vscode-symbolIcon-booleanForeground); } +.codicon.codicon-symbol-class { color: var(--vscode-symbolIcon-classForeground); } +.codicon.codicon-symbol-method { color: var(--vscode-symbolIcon-methodForeground); } +.codicon.codicon-symbol-color { color: var(--vscode-symbolIcon-colorForeground); } +.codicon.codicon-symbol-constant { color: var(--vscode-symbolIcon-constantForeground); } +.codicon.codicon-symbol-constructor { color: var(--vscode-symbolIcon-constructorForeground); } +.codicon.codicon-symbol-value, +.codicon.codicon-symbol-enum { color: var(--vscode-symbolIcon-enumeratorForeground); } +.codicon.codicon-symbol-enum-member { color: var(--vscode-symbolIcon-enumeratorMemberForeground); } +.codicon.codicon-symbol-event { color: var(--vscode-symbolIcon-eventForeground); } +.codicon.codicon-symbol-field { color: var(--vscode-symbolIcon-fieldForeground); } +.codicon.codicon-symbol-file { color: var(--vscode-symbolIcon-fileForeground); } +.codicon.codicon-symbol-folder { color: var(--vscode-symbolIcon-folderForeground); } +.codicon.codicon-symbol-function { color: var(--vscode-symbolIcon-functionForeground); } +.codicon.codicon-symbol-interface { color: var(--vscode-symbolIcon-interfaceForeground); } +.codicon.codicon-symbol-key { color: var(--vscode-symbolIcon-keyForeground); } +.codicon.codicon-symbol-keyword { color: var(--vscode-symbolIcon-keywordForeground); } +.codicon.codicon-symbol-module { color: var(--vscode-symbolIcon-moduleForeground); } +.codicon.codicon-symbol-namespace { color: var(--vscode-symbolIcon-namespaceForeground); } +.codicon.codicon-symbol-null { color: var(--vscode-symbolIcon-nullForeground); } +.codicon.codicon-symbol-number { color: var(--vscode-symbolIcon-numberForeground); } +.codicon.codicon-symbol-object { color: var(--vscode-symbolIcon-objectForeground); } +.codicon.codicon-symbol-operator { color: var(--vscode-symbolIcon-operatorForeground); } +.codicon.codicon-symbol-package { color: var(--vscode-symbolIcon-packageForeground); } +.codicon.codicon-symbol-property { color: var(--vscode-symbolIcon-propertyForeground); } +.codicon.codicon-symbol-reference { color: var(--vscode-symbolIcon-referenceForeground); } +.codicon.codicon-symbol-snippet { color: var(--vscode-symbolIcon-snippetForeground); } +.codicon.codicon-symbol-string { color: var(--vscode-symbolIcon-stringForeground); } +.codicon.codicon-symbol-struct { color: var(--vscode-symbolIcon-structForeground); } +.codicon.codicon-symbol-text { color: var(--vscode-symbolIcon-textForeground); } +.codicon.codicon-symbol-type-parameter { color: var(--vscode-typeParameterForeground); } +.codicon.codicon-symbol-unit { color: var(--vscode-symbolIcon-unitForeground); } +.codicon.codicon-symbol-variable { color: var(--vscode-symbolIcon-variableForeground); } diff --git a/src/vs/editor/contrib/symbolIcons/browser/symbolIcons.ts b/src/vs/editor/contrib/symbolIcons/browser/symbolIcons.ts index 083a8ccdb5e..64ccb1bc618 100644 --- a/src/vs/editor/contrib/symbolIcons/browser/symbolIcons.ts +++ b/src/vs/editor/contrib/symbolIcons/browser/symbolIcons.ts @@ -3,10 +3,9 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { Codicon } from 'vs/base/common/codicons'; +import 'vs/css!./symbolIcons'; import { localize } from 'vs/nls'; import { foreground, registerColor } from 'vs/platform/theme/common/colorRegistry'; -import { IColorTheme, ICssStyleCollector, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; export const SYMBOL_ICON_ARRAY_FOREGROUND = registerColor('symbolIcon.arrayForeground', { dark: foreground, @@ -238,172 +237,3 @@ export const SYMBOL_ICON_VARIABLE_FOREGROUND = registerColor('symbolIcon.variabl hcDark: '#75BEFF', hcLight: '#007ACC', }, localize('symbolIcon.variableForeground', 'The foreground color for variable symbols. These symbols appear in the outline, breadcrumb, and suggest widget.')); - -registerThemingParticipant((theme: IColorTheme, collector: ICssStyleCollector) => { - - const symbolIconArrayColor = theme.getColor(SYMBOL_ICON_ARRAY_FOREGROUND); - if (symbolIconArrayColor) { - collector.addRule(`${Codicon.symbolArray.cssSelector} { color: ${symbolIconArrayColor}; }`); - } - - const symbolIconBooleanColor = theme.getColor(SYMBOL_ICON_BOOLEAN_FOREGROUND); - if (symbolIconBooleanColor) { - collector.addRule(`${Codicon.symbolBoolean.cssSelector} { color: ${symbolIconBooleanColor}; }`); - } - - const symbolIconClassColor = theme.getColor(SYMBOL_ICON_CLASS_FOREGROUND); - if (symbolIconClassColor) { - collector.addRule(`${Codicon.symbolClass.cssSelector} { color: ${symbolIconClassColor}; }`); - } - - const symbolIconMethodColor = theme.getColor(SYMBOL_ICON_METHOD_FOREGROUND); - if (symbolIconMethodColor) { - collector.addRule(`${Codicon.symbolMethod.cssSelector} { color: ${symbolIconMethodColor}; }`); - } - - const symbolIconColorColor = theme.getColor(SYMBOL_ICON_COLOR_FOREGROUND); - if (symbolIconColorColor) { - collector.addRule(`${Codicon.symbolColor.cssSelector} { color: ${symbolIconColorColor}; }`); - } - - const symbolIconConstantColor = theme.getColor(SYMBOL_ICON_CONSTANT_FOREGROUND); - if (symbolIconConstantColor) { - collector.addRule(`${Codicon.symbolConstant.cssSelector} { color: ${symbolIconConstantColor}; }`); - } - - const symbolIconConstructorColor = theme.getColor(SYMBOL_ICON_CONSTRUCTOR_FOREGROUND); - if (symbolIconConstructorColor) { - collector.addRule(`${Codicon.symbolConstructor.cssSelector} { color: ${symbolIconConstructorColor}; }`); - } - - const symbolIconEnumeratorColor = theme.getColor(SYMBOL_ICON_ENUMERATOR_FOREGROUND); - if (symbolIconEnumeratorColor) { - collector.addRule(` - ${Codicon.symbolValue.cssSelector},${Codicon.symbolEnum.cssSelector} { color: ${symbolIconEnumeratorColor}; }`); - } - - const symbolIconEnumeratorMemberColor = theme.getColor(SYMBOL_ICON_ENUMERATOR_MEMBER_FOREGROUND); - if (symbolIconEnumeratorMemberColor) { - collector.addRule(`${Codicon.symbolEnumMember.cssSelector} { color: ${symbolIconEnumeratorMemberColor}; }`); - } - - const symbolIconEventColor = theme.getColor(SYMBOL_ICON_EVENT_FOREGROUND); - if (symbolIconEventColor) { - collector.addRule(`${Codicon.symbolEvent.cssSelector} { color: ${symbolIconEventColor}; }`); - } - - const symbolIconFieldColor = theme.getColor(SYMBOL_ICON_FIELD_FOREGROUND); - if (symbolIconFieldColor) { - collector.addRule(`${Codicon.symbolField.cssSelector} { color: ${symbolIconFieldColor}; }`); - } - - const symbolIconFileColor = theme.getColor(SYMBOL_ICON_FILE_FOREGROUND); - if (symbolIconFileColor) { - collector.addRule(`${Codicon.symbolFile.cssSelector} { color: ${symbolIconFileColor}; }`); - } - - const symbolIconFolderColor = theme.getColor(SYMBOL_ICON_FOLDER_FOREGROUND); - if (symbolIconFolderColor) { - collector.addRule(`${Codicon.symbolFolder.cssSelector} { color: ${symbolIconFolderColor}; }`); - } - - const symbolIconFunctionColor = theme.getColor(SYMBOL_ICON_FUNCTION_FOREGROUND); - if (symbolIconFunctionColor) { - collector.addRule(`${Codicon.symbolFunction.cssSelector} { color: ${symbolIconFunctionColor}; }`); - } - - const symbolIconInterfaceColor = theme.getColor(SYMBOL_ICON_INTERFACE_FOREGROUND); - if (symbolIconInterfaceColor) { - collector.addRule(`${Codicon.symbolInterface.cssSelector} { color: ${symbolIconInterfaceColor}; }`); - } - - const symbolIconKeyColor = theme.getColor(SYMBOL_ICON_KEY_FOREGROUND); - if (symbolIconKeyColor) { - collector.addRule(`${Codicon.symbolKey.cssSelector} { color: ${symbolIconKeyColor}; }`); - } - - const symbolIconKeywordColor = theme.getColor(SYMBOL_ICON_KEYWORD_FOREGROUND); - if (symbolIconKeywordColor) { - collector.addRule(`${Codicon.symbolKeyword.cssSelector} { color: ${symbolIconKeywordColor}; }`); - } - - const symbolIconModuleColor = theme.getColor(SYMBOL_ICON_MODULE_FOREGROUND); - if (symbolIconModuleColor) { - collector.addRule(`${Codicon.symbolModule.cssSelector} { color: ${symbolIconModuleColor}; }`); - } - - const outlineNamespaceColor = theme.getColor(SYMBOL_ICON_NAMESPACE_FOREGROUND); - if (outlineNamespaceColor) { - collector.addRule(`${Codicon.symbolNamespace.cssSelector} { color: ${outlineNamespaceColor}; }`); - } - - const symbolIconNullColor = theme.getColor(SYMBOL_ICON_NULL_FOREGROUND); - if (symbolIconNullColor) { - collector.addRule(`${Codicon.symbolNull.cssSelector} { color: ${symbolIconNullColor}; }`); - } - - const symbolIconNumberColor = theme.getColor(SYMBOL_ICON_NUMBER_FOREGROUND); - if (symbolIconNumberColor) { - collector.addRule(`${Codicon.symbolNumber.cssSelector} { color: ${symbolIconNumberColor}; }`); - } - - const symbolIconObjectColor = theme.getColor(SYMBOL_ICON_OBJECT_FOREGROUND); - if (symbolIconObjectColor) { - collector.addRule(`${Codicon.symbolObject.cssSelector} { color: ${symbolIconObjectColor}; }`); - } - - const symbolIconOperatorColor = theme.getColor(SYMBOL_ICON_OPERATOR_FOREGROUND); - if (symbolIconOperatorColor) { - collector.addRule(`${Codicon.symbolOperator.cssSelector} { color: ${symbolIconOperatorColor}; }`); - } - - const symbolIconPackageColor = theme.getColor(SYMBOL_ICON_PACKAGE_FOREGROUND); - if (symbolIconPackageColor) { - collector.addRule(`${Codicon.symbolPackage.cssSelector} { color: ${symbolIconPackageColor}; }`); - } - - const symbolIconPropertyColor = theme.getColor(SYMBOL_ICON_PROPERTY_FOREGROUND); - if (symbolIconPropertyColor) { - collector.addRule(`${Codicon.symbolProperty.cssSelector} { color: ${symbolIconPropertyColor}; }`); - } - - const symbolIconReferenceColor = theme.getColor(SYMBOL_ICON_REFERENCE_FOREGROUND); - if (symbolIconReferenceColor) { - collector.addRule(`${Codicon.symbolReference.cssSelector} { color: ${symbolIconReferenceColor}; }`); - } - - const symbolIconSnippetColor = theme.getColor(SYMBOL_ICON_SNIPPET_FOREGROUND); - if (symbolIconSnippetColor) { - collector.addRule(`${Codicon.symbolSnippet.cssSelector} { color: ${symbolIconSnippetColor}; }`); - } - - const symbolIconStringColor = theme.getColor(SYMBOL_ICON_STRING_FOREGROUND); - if (symbolIconStringColor) { - collector.addRule(`${Codicon.symbolString.cssSelector} { color: ${symbolIconStringColor}; }`); - } - - const symbolIconStructColor = theme.getColor(SYMBOL_ICON_STRUCT_FOREGROUND); - if (symbolIconStructColor) { - collector.addRule(`${Codicon.symbolStruct.cssSelector} { color: ${symbolIconStructColor}; }`); - } - - const symbolIconTextColor = theme.getColor(SYMBOL_ICON_TEXT_FOREGROUND); - if (symbolIconTextColor) { - collector.addRule(`${Codicon.symbolText.cssSelector} { color: ${symbolIconTextColor}; }`); - } - - const symbolIconTypeParameterColor = theme.getColor(SYMBOL_ICON_TYPEPARAMETER_FOREGROUND); - if (symbolIconTypeParameterColor) { - collector.addRule(`${Codicon.symbolTypeParameter.cssSelector} { color: ${symbolIconTypeParameterColor}; }`); - } - - const symbolIconUnitColor = theme.getColor(SYMBOL_ICON_UNIT_FOREGROUND); - if (symbolIconUnitColor) { - collector.addRule(`${Codicon.symbolUnit.cssSelector} { color: ${symbolIconUnitColor}; }`); - } - - const symbolIconVariableColor = theme.getColor(SYMBOL_ICON_VARIABLE_FOREGROUND); - if (symbolIconVariableColor) { - collector.addRule(`${Codicon.symbolVariable.cssSelector} { color: ${symbolIconVariableColor}; }`); - } -}); diff --git a/src/vs/workbench/contrib/typeHierarchy/browser/media/typeHierarchy.css b/src/vs/workbench/contrib/typeHierarchy/browser/media/typeHierarchy.css index 3bf798683a7..ab44fb570a5 100644 --- a/src/vs/workbench/contrib/typeHierarchy/browser/media/typeHierarchy.css +++ b/src/vs/workbench/contrib/typeHierarchy/browser/media/typeHierarchy.css @@ -25,6 +25,16 @@ height: 100%; } +.monaco-editor .type-hierarchy .tree { + background-color: var(--vscode-peekViewResult-background); + color: var(--vscode-peekViewResult-fileForeground); +} + +.monaco-editor .type-hierarchy .tree .monaco-list:focus .monaco-list-rows > .monaco-list-row.selected:not(.highlighted) { + background-color: var(--vscode-peekViewResult-selectionBackground); + color: var(--vscode-peekViewResult-selectionForeground) !important; +} + .monaco-workbench .type-hierarchy .tree .typehierarchy-element { display: flex; flex: 1; @@ -35,3 +45,18 @@ .monaco-workbench .type-hierarchy .tree .typehierarchy-element .monaco-icon-label { padding-left: 4px; } + +.monaco-editor .type-hierarchy .type-decoration { + background-color: var(--vscode-peekViewEditor-matchHighlightBackground); + border: 2px solid var(--vscode-peekViewEditor-matchHighlightBorder); + box-sizing: border-box; +} + +.monaco-editor .type-hierarchy .editor .monaco-editor .monaco-editor-background, +.monaco-editor .type-hierarchy .editor .monaco-editor .inputarea.ime-input { + background-color: var(--vscode-peekViewEditor-background); +} + +.monaco-editor .type-hierarchy .editor .monaco-editor .margin { + background-color: var(--vscode-peekViewEditorGutter-background); +} diff --git a/src/vs/workbench/contrib/typeHierarchy/browser/typeHierarchyPeek.ts b/src/vs/workbench/contrib/typeHierarchy/browser/typeHierarchyPeek.ts index 5fa49e2ea7d..a166eb0431c 100644 --- a/src/vs/workbench/contrib/typeHierarchy/browser/typeHierarchyPeek.ts +++ b/src/vs/workbench/contrib/typeHierarchy/browser/typeHierarchyPeek.ts @@ -30,7 +30,7 @@ import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IWorkbenchAsyncDataTreeOptions, WorkbenchAsyncDataTree } from 'vs/platform/list/browser/listService'; import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; -import { IColorTheme, IThemeService, registerThemingParticipant, themeColorFromId } from 'vs/platform/theme/common/themeService'; +import { IColorTheme, IThemeService, themeColorFromId } from 'vs/platform/theme/common/themeService'; import * as typeHTree from 'vs/workbench/contrib/typeHierarchy/browser/typeHierarchyTree'; import { TypeHierarchyDirection, TypeHierarchyModel } from 'vs/workbench/contrib/typeHierarchy/common/typeHierarchy'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; @@ -421,47 +421,3 @@ export class TypeHierarchyTreePeekWidget extends peekView.PeekViewWidget { } } } - -registerThemingParticipant((theme, collector) => { - const referenceHighlightColor = theme.getColor(peekView.peekViewEditorMatchHighlight); - if (referenceHighlightColor) { - collector.addRule(`.monaco-editor .type-hierarchy .type-decoration { background-color: ${referenceHighlightColor}; }`); - } - const referenceHighlightBorder = theme.getColor(peekView.peekViewEditorMatchHighlightBorder); - if (referenceHighlightBorder) { - collector.addRule(`.monaco-editor .type-hierarchy .type-decoration { border: 2px solid ${referenceHighlightBorder}; box-sizing: border-box; }`); - } - const resultsBackground = theme.getColor(peekView.peekViewResultsBackground); - if (resultsBackground) { - collector.addRule(`.monaco-editor .type-hierarchy .tree { background-color: ${resultsBackground}; }`); - } - const resultsMatchForeground = theme.getColor(peekView.peekViewResultsFileForeground); - if (resultsMatchForeground) { - collector.addRule(`.monaco-editor .type-hierarchy .tree { color: ${resultsMatchForeground}; }`); - } - const resultsSelectedBackground = theme.getColor(peekView.peekViewResultsSelectionBackground); - if (resultsSelectedBackground) { - collector.addRule(`.monaco-editor .type-hierarchy .tree .monaco-list:focus .monaco-list-rows > .monaco-list-row.selected:not(.highlighted) { background-color: ${resultsSelectedBackground}; }`); - } - const resultsSelectedForeground = theme.getColor(peekView.peekViewResultsSelectionForeground); - if (resultsSelectedForeground) { - collector.addRule(`.monaco-editor .type-hierarchy .tree .monaco-list:focus .monaco-list-rows > .monaco-list-row.selected:not(.highlighted) { color: ${resultsSelectedForeground} !important; }`); - } - const editorBackground = theme.getColor(peekView.peekViewEditorBackground); - if (editorBackground) { - collector.addRule( - `.monaco-editor .type-hierarchy .editor .monaco-editor .monaco-editor-background,` + - `.monaco-editor .type-hierarchy .editor .monaco-editor .inputarea.ime-input {` + - ` background-color: ${editorBackground};` + - `}` - ); - } - const editorGutterBackground = theme.getColor(peekView.peekViewEditorGutterBackground); - if (editorGutterBackground) { - collector.addRule( - `.monaco-editor .type-hierarchy .editor .monaco-editor .margin {` + - ` background-color: ${editorGutterBackground};` + - `}` - ); - } -}); From e8ae985c5617428400fe175d49182e02486b9a67 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 3 Nov 2022 14:04:24 +0100 Subject: [PATCH 072/185] starting timings (perf machine) shouldn't complain about missing cached data (#165342) --- .../contrib/performance/electron-sandbox/startupTimings.ts | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/vs/workbench/contrib/performance/electron-sandbox/startupTimings.ts b/src/vs/workbench/contrib/performance/electron-sandbox/startupTimings.ts index 6df510a0a6f..097fa4723e9 100644 --- a/src/vs/workbench/contrib/performance/electron-sandbox/startupTimings.ts +++ b/src/vs/workbench/contrib/performance/electron-sandbox/startupTimings.ts @@ -15,13 +15,11 @@ import { IUpdateService } from 'vs/platform/update/common/update'; import { INativeHostService } from 'vs/platform/native/electron-sandbox/native'; import * as files from 'vs/workbench/contrib/files/common/files'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { didUseCachedData } from 'vs/workbench/services/timer/electron-sandbox/timerService'; import { ITimerService } from 'vs/workbench/services/timer/browser/timerService'; import { IFileService } from 'vs/platform/files/common/files'; import { URI } from 'vs/base/common/uri'; import { VSBuffer } from 'vs/base/common/buffer'; import { IWorkspaceTrustManagementService } from 'vs/platform/workspace/common/workspaceTrust'; -import { IStorageService } from 'vs/platform/storage/common/storage'; import { IPaneCompositePartService } from 'vs/workbench/services/panecomposite/browser/panecomposite'; import { ViewContainerLocation } from 'vs/workbench/common/views'; @@ -39,7 +37,6 @@ export class StartupTimings implements IWorkbenchContribution { @INativeWorkbenchEnvironmentService private readonly _environmentService: INativeWorkbenchEnvironmentService, @IProductService private readonly _productService: IProductService, @IWorkspaceTrustManagementService private readonly _workspaceTrustService: IWorkspaceTrustManagementService, - @IStorageService private readonly _storageService: IStorageService ) { this._report().catch(onUnexpectedError); } @@ -110,10 +107,6 @@ export class StartupTimings implements IWorkbenchContribution { if (activePanel) { return 'Current active panel : ' + this._paneCompositeService.getPaneComposite(activePanel.getId(), ViewContainerLocation.Panel)?.name; } - const noCachedData = this._environmentService.args['no-cached-data']; - if (!noCachedData && !didUseCachedData(this._productService, this._storageService, this._environmentService)) { - return 'Either cache data is rejected or not created'; - } if (!await this._updateService.isLatestVersion()) { return 'Not on latest version, updates available'; } From 46face3cc7d7104a0714dac304373f75eb891799 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 3 Nov 2022 14:12:01 +0100 Subject: [PATCH 073/185] combine all origin selection ranges when having multiple go-to via mouse result (#165349) fixes https://github.com/microsoft/vscode/issues/160958 --- .../browser/link/goToDefinitionAtPosition.ts | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/src/vs/editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition.ts b/src/vs/editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition.ts index 4f6c0f808f6..5d9e2dcd8a0 100644 --- a/src/vs/editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition.ts +++ b/src/vs/editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition.ts @@ -164,10 +164,22 @@ export class GotoDefinitionAtPositionEditorContribution implements IEditorContri return; } + const linkRange = results[0].originSelectionRange + ? Range.lift(results[0].originSelectionRange) + : new Range(position.lineNumber, word.startColumn, position.lineNumber, word.endColumn); + // Multiple results if (results.length > 1) { + + let combinedRange = linkRange; + for (const { originSelectionRange } of results) { + if (originSelectionRange) { + combinedRange = Range.plusRange(combinedRange, originSelectionRange); + } + } + this.addDecoration( - new Range(position.lineNumber, word.startColumn, position.lineNumber, word.endColumn), + combinedRange, new MarkdownString().appendText(nls.localize('multipleResults', "Click to show {0} definitions.", results.length)) ); } @@ -197,17 +209,9 @@ export class GotoDefinitionAtPositionEditorContribution implements IEditorContri } const previewValue = this.getPreviewValue(textEditorModel, startLineNumber, result); - - let wordRange: Range; - if (result.originSelectionRange) { - wordRange = Range.lift(result.originSelectionRange); - } else { - wordRange = new Range(position.lineNumber, word.startColumn, position.lineNumber, word.endColumn); - } - const languageId = this.languageService.guessLanguageIdByFilepathOrFirstLine(textEditorModel.uri); this.addDecoration( - wordRange, + linkRange, new MarkdownString().appendCodeblock(languageId ? languageId : '', previewValue) ); ref.dispose(); From 16f30d90d2916581f4c3ad0ab853653c22cfc5c2 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 3 Nov 2022 14:48:29 +0100 Subject: [PATCH 074/185] stricter definition for what a trival snippet it (#165355) fixes https://github.com/microsoft/vscode/issues/163808 --- .../contrib/snippet/browser/snippetParser.ts | 7 +++++++ .../contrib/snippet/browser/snippetSession.ts | 18 ++++++++++++++++-- .../test/browser/snippetController2.test.ts | 14 ++++++++++++++ 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/src/vs/editor/contrib/snippet/browser/snippetParser.ts b/src/vs/editor/contrib/snippet/browser/snippetParser.ts index da4b4629d7d..f262ddf34dc 100644 --- a/src/vs/editor/contrib/snippet/browser/snippetParser.ts +++ b/src/vs/editor/contrib/snippet/browser/snippetParser.ts @@ -165,6 +165,13 @@ export abstract class Marker { return this._children; } + get rightMostDescendant(): Marker { + if (this._children.length > 0) { + return this._children[this._children.length - 1].rightMostDescendant; + } + return this; + } + get snippet(): TextmateSnippet | undefined { let candidate: Marker = this; while (true) { diff --git a/src/vs/editor/contrib/snippet/browser/snippetSession.ts b/src/vs/editor/contrib/snippet/browser/snippetSession.ts index a25ee16b15c..c50df9d7914 100644 --- a/src/vs/editor/contrib/snippet/browser/snippetSession.ts +++ b/src/vs/editor/contrib/snippet/browser/snippetSession.ts @@ -208,9 +208,23 @@ export class OneSnippet { return this._snippet.placeholders.length > 0; } + /** + * A snippet is trivial when it has no placeholder or only a final placeholder at + * its very end + */ get isTrivialSnippet(): boolean { - return this._snippet.placeholders.length === 0 - || (this._snippet.placeholders.length === 1 && this._snippet.placeholders[0].isFinalTabstop); + if (this._snippet.placeholders.length === 0) { + return true; + } + if (this._snippet.placeholders.length === 1) { + const [placeholder] = this._snippet.placeholders; + if (placeholder.isFinalTabstop) { + if (this._snippet.rightMostDescendant === placeholder) { + return true; + } + } + } + return false; } computePossibleSelections() { diff --git a/src/vs/editor/contrib/snippet/test/browser/snippetController2.test.ts b/src/vs/editor/contrib/snippet/test/browser/snippetController2.test.ts index fce4d2c432b..4279ca422a4 100644 --- a/src/vs/editor/contrib/snippet/test/browser/snippetController2.test.ts +++ b/src/vs/editor/contrib/snippet/test/browser/snippetController2.test.ts @@ -692,4 +692,18 @@ suite('SnippetController2', function () { assert.deepStrictEqual(editor.getSelections(), [new Selection(1, 5, 1, 5), new Selection(1, 10, 1, 10), new Selection(2, 5, 2, 5), new Selection(2, 10, 2, 10)]); }); }); + + test('Bug: cursor position $0 with user snippets #163808', function () { + + const ctrl = instaService.createInstance(SnippetController2, editor); + model.setValue(''); + + ctrl.insert('\n \n$0"\n'); + assert.deepStrictEqual(editor.getSelections(), [new Selection(1, 23, 1, 23)]); + + ctrl.insert('Qualifier="$0"'); + assert.strictEqual(model.getValue(), '\n \n"\n'); + assert.deepStrictEqual(editor.getSelections(), [new Selection(1, 34, 1, 34)]); + + }); }); From 4608b378a8101ff273fa5db36516da6022f66bbf Mon Sep 17 00:00:00 2001 From: Alexandru Dima Date: Thu, 3 Nov 2022 14:48:47 +0100 Subject: [PATCH 075/185] Align cache key across OSes (#165042) --- build/azure-pipelines/win32/product-build-win32.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/build/azure-pipelines/win32/product-build-win32.yml b/build/azure-pipelines/win32/product-build-win32.yml index 9f62ea0a0c3..f15df2d387c 100644 --- a/build/azure-pipelines/win32/product-build-win32.yml +++ b/build/azure-pipelines/win32/product-build-win32.yml @@ -86,14 +86,13 @@ steps: - powershell: | if (!(Test-Path ".build")) { New-Item -Path ".build" -ItemType Directory } - "$(VSCODE_ARCH)" | Out-File -Encoding ascii -NoNewLine .build\arch - node build/azure-pipelines/common/computeNodeModulesCacheKey.js > .build/yarnlockhash + node build/azure-pipelines/common/computeNodeModulesCacheKey.js $(VSCODE_ARCH) > .build/yarnlockhash node build/azure-pipelines/common/computeBuiltInDepsCacheKey.js > .build/builtindepshash displayName: Prepare yarn cache flags - task: Cache@2 inputs: - key: "nodeModules | $(Agent.OS) | .build/arch, .build/yarnlockhash" + key: "nodeModules | $(Agent.OS) | .build/yarnlockhash" path: .build/node_modules_cache cacheHitVar: NODE_MODULES_RESTORED displayName: Restore node_modules cache From fe5f564db16038785936282be7f6b871f34b8bd1 Mon Sep 17 00:00:00 2001 From: Joyce Er Date: Thu, 3 Nov 2022 08:19:58 -0700 Subject: [PATCH 076/185] Attempt to fix Rust clippy lint errors (#165377) --- cli/src/self_update.rs | 2 +- cli/src/tunnels/code_server.rs | 2 +- cli/src/util/tar.rs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cli/src/self_update.rs b/cli/src/self_update.rs index 3ea8274b338..7a5b41e83a7 100644 --- a/cli/src/self_update.rs +++ b/cli/src/self_update.rs @@ -150,7 +150,7 @@ fn copy_file_metadata(from: &Path, to: &Path) -> Result<(), std::io::Error> { use std::os::unix::fs::MetadataExt; let metadata = from.metadata()?; - fs::set_permissions(&to, metadata.permissions())?; + fs::set_permissions(to, metadata.permissions())?; // based on coreutils' chown https://github.com/uutils/coreutils/blob/72b4629916abe0852ad27286f4e307fbca546b6e/src/chown/chown.rs#L266-L281 let s = std::ffi::CString::new(to.as_os_str().as_bytes()).unwrap(); diff --git a/cli/src/tunnels/code_server.rs b/cli/src/tunnels/code_server.rs index 559f5e075f6..e19cd29d6f7 100644 --- a/cli/src/tunnels/code_server.rs +++ b/cli/src/tunnels/code_server.rs @@ -352,7 +352,7 @@ fn install_server( unzip_downloaded_release(compressed_file, &paths.server_dir, SilentCopyProgress())?; - match fs::remove_file(&compressed_file) { + match fs::remove_file(compressed_file) { Ok(()) => {} Err(e) => { if e.kind() != ErrorKind::NotFound { diff --git a/cli/src/util/tar.rs b/cli/src/util/tar.rs index b5884e67afd..77dd67abbb0 100644 --- a/cli/src/util/tar.rs +++ b/cli/src/util/tar.rs @@ -87,7 +87,7 @@ where }); if let Some(p) = path.parent() { - fs::create_dir_all(&p) + fs::create_dir_all(p) .map_err(|e| wrap(e, format!("could not create dir for {}", p.display())))?; } From c6210c1c58544dbafe837870f9d77d8146989b35 Mon Sep 17 00:00:00 2001 From: Logan Ramos Date: Thu, 3 Nov 2022 11:36:45 -0400 Subject: [PATCH 077/185] Reduce loaded web modules (#165369) --- build/.webignore | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/build/.webignore b/build/.webignore index 1a5b3ee2c10..afb0cee5808 100644 --- a/build/.webignore +++ b/build/.webignore @@ -36,3 +36,16 @@ xterm-addon-webgl/out/** # This makes sure the model is included in the package !@vscode/vscode-languagedetection/model/** +# Ensure only the required telemetry pieces are loaded in web to reduce bundle size +@microsoft/1ds-core-js/** +@microsoft/1ds-post-js/** +@microsoft/applicationinsights-core-js/** +@microsoft/applicationinsights-shims/** +!@microsoft/1ds-core-js/dist/ms.core.min.js +!@microsoft/1ds-post-js/dist/ms.post.min.js +!@microsoft/applicationinsights-core-js/browser/applicationinsights-core-js.min.js +!@microsoft/applicationinsights-shims/dist/umd/applicationinsights-shims.min.js + + + + From b75ba63f04aa64a8e1fdfb4e0da8af44b947f98c Mon Sep 17 00:00:00 2001 From: Joyce Er Date: Thu, 3 Nov 2022 08:41:14 -0700 Subject: [PATCH 078/185] Partially reverts 1b83b96a4658097d1939f0b6ec68823197340a00 (#165372) Partially reverts https://github.com/microsoft/vscode/commit/1b83b96a4658097d1939f0b6ec68823197340a00 --- .../editSessions/browser/editSessions.contribution.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/editSessions/browser/editSessions.contribution.ts b/src/vs/workbench/contrib/editSessions/browser/editSessions.contribution.ts index 0792fa24033..7f5a295c1a9 100644 --- a/src/vs/workbench/contrib/editSessions/browser/editSessions.contribution.ts +++ b/src/vs/workbench/contrib/editSessions/browser/editSessions.contribution.ts @@ -297,7 +297,11 @@ export class EditSessionsContribution extends Disposable implements IWorkbenchCo // Run the store action to get back a ref let ref: string | undefined; if (shouldStoreEditSession) { - ref = await that.storeEditSession(false); + ref = await that.progressService.withProgress({ + location: ProgressLocation.Notification, + type: 'syncing', + title: localize('store your edit session', 'Storing your edit session...') + }, async () => that.storeEditSession(false)); } let uri = workspaceUri ?? await that.pickContinueEditSessionDestination(); @@ -406,7 +410,7 @@ export class EditSessionsContribution extends Disposable implements IWorkbenchCo } else if (ref !== undefined) { this.notificationService.warn(localize('no edit session content for ref', 'Could not resume edit session contents for ID {0}.', ref)); } - this.logService.info(`Aborting resuming edit session as no edit session content is available to be applied from ref ${ref}.`); + this.logService.info(ref !== undefined ? `Aborting resuming edit session as no edit session content is available to be applied from ref ${ref}.` : `Aborting resuming edit session as no edit session content is available to be applied`); return; } const editSession = data.editSession; From 739bf4e32a08a2052f7704293e5414d0ac2d98aa Mon Sep 17 00:00:00 2001 From: Henning Dieterichs Date: Thu, 3 Nov 2022 17:31:09 +0100 Subject: [PATCH 079/185] Implement Add "Ignore" buttons #164425 (#165387) --- .../browser/model/mergeEditorModel.ts | 64 +++++++++++++------ .../browser/model/textModelDiffs.ts | 4 ++ .../contrib/mergeEditor/browser/utils.ts | 24 ++++--- .../browser/view/conflictActions.ts | 33 +++++----- .../view/editors/inputCodeEditorView.ts | 7 +- .../mergeEditor/browser/view/viewModel.ts | 16 +++-- 6 files changed, 94 insertions(+), 54 deletions(-) diff --git a/src/vs/workbench/contrib/mergeEditor/browser/model/mergeEditorModel.ts b/src/vs/workbench/contrib/mergeEditor/browser/model/mergeEditorModel.ts index 68e9fce6e62..3829f745842 100644 --- a/src/vs/workbench/contrib/mergeEditor/browser/model/mergeEditorModel.ts +++ b/src/vs/workbench/contrib/mergeEditor/browser/model/mergeEditorModel.ts @@ -17,7 +17,7 @@ import { DetailedLineRangeMapping, DocumentLineRangeMap, DocumentRangeMap, LineR import { TextModelDiffChangeReason, TextModelDiffs, TextModelDiffState } from 'vs/workbench/contrib/mergeEditor/browser/model/textModelDiffs'; import { MergeEditorTelemetry } from 'vs/workbench/contrib/mergeEditor/browser/telemetry'; import { leftJoin } from 'vs/workbench/contrib/mergeEditor/browser/utils'; -import { ModifiedBaseRange, ModifiedBaseRangeState, ModifiedBaseRangeStateKind } from './modifiedBaseRange'; +import { InputNumber, ModifiedBaseRange, ModifiedBaseRangeState, ModifiedBaseRangeStateKind } from './modifiedBaseRange'; export interface InputData { readonly textModel: ITextModel; @@ -40,13 +40,7 @@ export class MergeEditorModel extends EditorModel { derived('modifiedBaseRangeResultStates', reader => { const map = new Map( this.modifiedBaseRanges.read(reader).map<[ModifiedBaseRange, ModifiedBaseRangeData]>((s) => [ - s, - { - accepted: observableValue(`BaseRangeState${s.baseRange}`, ModifiedBaseRangeState.base), - handled: observableValue(`BaseRangeHandledState${s.baseRange}`, false), - computedFromDiffing: false, - previousNonDiffingState: undefined, - } + s, new ModifiedBaseRangeData(s) ]) ); return map; @@ -109,7 +103,9 @@ export class MergeEditorModel extends EditorModel { shouldRecomputeHandledFromAccepted = false; for (const [_range, observableState] of states) { const state = observableState.accepted.get(); - observableState.handled.set(!(state.kind === ModifiedBaseRangeStateKind.base || state.kind === ModifiedBaseRangeStateKind.unrecognized), tx); + const handled = !(state.kind === ModifiedBaseRangeStateKind.base || state.kind === ModifiedBaseRangeStateKind.unrecognized); + observableState.handledInput1.set(handled, tx); + observableState.handledInput2.set(handled, tx); } } }); @@ -149,7 +145,8 @@ export class MergeEditorModel extends EditorModel { state.accepted.set(newState, tx); state.computedFromDiffing = false; state.previousNonDiffingState = undefined; - state.handled.set(handled, tx); + state.handledInput1.set(handled, tx); + state.handledInput2.set(handled, tx); } this.resultTextModel.pushEditOperations(null, [{ @@ -201,6 +198,7 @@ export class MergeEditorModel extends EditorModel { public readonly baseInput2Diffs = this.input2TextModelDiffs.diffs; public readonly baseResultDiffs = this.resultTextModelDiffs.diffs; + public get isApplyingEditInResult(): boolean { return this.resultTextModelDiffs.isApplyingChange; } public readonly input1ResultMapping = derived('input1ResultMapping', reader => { return this.getInputResultMapping( this.baseInput1Diffs.read(reader), @@ -408,7 +406,7 @@ export class MergeEditorModel extends EditorModel { public setState( baseRange: ModifiedBaseRange, state: ModifiedBaseRangeState, - markHandled: boolean, + markInputAsHandled: boolean | InputNumber, transaction: ITransaction, pushStackElement: boolean = false ): void { @@ -444,8 +442,13 @@ export class MergeEditorModel extends EditorModel { } } - if (markHandled) { - existingState.handled.set(true, transaction); + if (markInputAsHandled !== false) { + if (markInputAsHandled === true || markInputAsHandled === 1) { + existingState.handledInput1.set(true, transaction); + } + if (markInputAsHandled === true || markInputAsHandled === 2) { + existingState.handledInput2.set(true, transaction); + } } } @@ -466,13 +469,32 @@ export class MergeEditorModel extends EditorModel { return this.modifiedBaseRangeResultStates.get().get(baseRange)!.handled; } + public isInputHandled(baseRange: ModifiedBaseRange, inputNumber: InputNumber): IObservable { + const state = this.modifiedBaseRangeResultStates.get().get(baseRange)!; + return inputNumber === 1 ? state.handledInput1 : state.handledInput2; + } + + public setInputHandled(baseRange: ModifiedBaseRange, inputNumber: InputNumber, handled: boolean, tx: ITransaction): void { + const state = this.modifiedBaseRangeResultStates.get().get(baseRange)!; + if (state.handled.get() === handled) { + return; + } + + if (inputNumber === 1) { + state.handledInput1.set(handled, tx); + } else { + state.handledInput2.set(handled, tx); + } + } + public setHandled(baseRange: ModifiedBaseRange, handled: boolean, tx: ITransaction): void { const state = this.modifiedBaseRangeResultStates.get().get(baseRange)!; if (state.handled.get() === handled) { return; } - state.handled.set(handled, tx); + state.handledInput1.set(handled, tx); + state.handledInput2.set(handled, tx); } public readonly unhandledConflictsCount = derived('unhandledConflictsCount', reader => { @@ -689,13 +711,17 @@ function arrayCount(array: Iterable, predicate: (value: T) => boolean): nu return count; } -interface ModifiedBaseRangeData { - accepted: ISettableObservable; +class ModifiedBaseRangeData { + constructor(private readonly baseRange: ModifiedBaseRange) { } - handled: ISettableObservable; + public accepted: ISettableObservable = observableValue(`BaseRangeState${this.baseRange.baseRange}`, ModifiedBaseRangeState.base); + public handledInput1: ISettableObservable = observableValue(`BaseRangeHandledState${this.baseRange.baseRange}.Input1`, false); + public handledInput2: ISettableObservable = observableValue(`BaseRangeHandledState${this.baseRange.baseRange}.Input2`, false); - computedFromDiffing: boolean; - previousNonDiffingState: ModifiedBaseRangeState | undefined; + public computedFromDiffing = false; + public previousNonDiffingState: ModifiedBaseRangeState | undefined = undefined; + + public readonly handled = derived('handled', reader => this.handledInput1.read(reader) && this.handledInput2.read(reader)); } export const enum MergeEditorModelState { diff --git a/src/vs/workbench/contrib/mergeEditor/browser/model/textModelDiffs.ts b/src/vs/workbench/contrib/mergeEditor/browser/model/textModelDiffs.ts index f2df1c973a4..b618ffd82bc 100644 --- a/src/vs/workbench/contrib/mergeEditor/browser/model/textModelDiffs.ts +++ b/src/vs/workbench/contrib/mergeEditor/browser/model/textModelDiffs.ts @@ -22,6 +22,10 @@ export class TextModelDiffs extends Disposable { private readonly barrier = new ReentrancyBarrier(); private isDisposed = false; + public get isApplyingChange() { + return this.barrier.isActive; + } + constructor( private readonly baseTextModel: ITextModel, private readonly textModel: ITextModel, diff --git a/src/vs/workbench/contrib/mergeEditor/browser/utils.ts b/src/vs/workbench/contrib/mergeEditor/browser/utils.ts index 30b984cda33..0cb2fee5697 100644 --- a/src/vs/workbench/contrib/mergeEditor/browser/utils.ts +++ b/src/vs/workbench/contrib/mergeEditor/browser/utils.ts @@ -12,43 +12,47 @@ import { IModelDeltaDecoration } from 'vs/editor/common/model'; import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; export class ReentrancyBarrier { - private isActive = false; + private _isActive = false; + + public get isActive() { + return this._isActive; + } public makeExclusive(fn: TFunction): TFunction { return ((...args: any[]) => { - if (this.isActive) { + if (this._isActive) { return; } - this.isActive = true; + this._isActive = true; try { return fn(...args); } finally { - this.isActive = false; + this._isActive = false; } }) as any; } public runExclusively(fn: () => void): void { - if (this.isActive) { + if (this._isActive) { return; } - this.isActive = true; + this._isActive = true; try { fn(); } finally { - this.isActive = false; + this._isActive = false; } } public runExclusivelyOrThrow(fn: () => void): void { - if (this.isActive) { + if (this._isActive) { throw new BugIndicatingError(); } - this.isActive = true; + this._isActive = true; try { fn(); } finally { - this.isActive = false; + this._isActive = false; } } } diff --git a/src/vs/workbench/contrib/mergeEditor/browser/view/conflictActions.ts b/src/vs/workbench/contrib/mergeEditor/browser/view/conflictActions.ts index ef6d59be3eb..101bcb8c7ef 100644 --- a/src/vs/workbench/contrib/mergeEditor/browser/view/conflictActions.ts +++ b/src/vs/workbench/contrib/mergeEditor/browser/view/conflictActions.ts @@ -127,7 +127,7 @@ export class ActionsSource { model.setState( modifiedBaseRange, state.withInputValue(inputNumber, true, false), - true, + inputNumber, tx ); model.telemetry.reportAcceptInvoked(inputNumber, state.includesInput(otherInputNumber)); @@ -159,7 +159,7 @@ export class ActionsSource { model.setState( modifiedBaseRange, state.withInputValue(inputNumber, true, false), - true, + inputNumber, tx ); model.telemetry.reportAcceptInvoked(inputNumber, state.includesInput(otherInputNumber)); @@ -174,7 +174,7 @@ export class ActionsSource { model.setState( modifiedBaseRange, state.withInputValue(inputNumber, true, true), - true, + inputNumber, tx ); model.telemetry.reportSmartCombinationInvoked(state.includesInput(otherInputNumber)); @@ -184,6 +184,19 @@ export class ActionsSource { } } + if (!model.isInputHandled(modifiedBaseRange, inputNumber).read(reader)) { + result.push( + command( + localize('ignore', 'Ignore'), + async () => { + transaction((tx) => { + model.setInputHandled(modifiedBaseRange, inputNumber, true, tx); + }); + }, + localize('markAsHandledTooltip', "Don't take this side of the conflict.") + ) + ); + } } return result; @@ -299,20 +312,6 @@ export class ActionsSource { ); } - if (state.kind === ModifiedBaseRangeStateKind.base && !model.isHandled(modifiedBaseRange).read(reader)) { - result.push( - command( - localize('markAsHandled', 'Mark As Handled'), - async () => { - transaction((tx) => { - model.setHandled(modifiedBaseRange, true, tx); - }); - }, - localize('markAsHandledTooltip', 'Marks this conflict as handled.') - ) - ); - } - return result; }); diff --git a/src/vs/workbench/contrib/mergeEditor/browser/view/editors/inputCodeEditorView.ts b/src/vs/workbench/contrib/mergeEditor/browser/view/editors/inputCodeEditorView.ts index 393e6be594d..604ddedb213 100644 --- a/src/vs/workbench/contrib/mergeEditor/browser/view/editors/inputCodeEditorView.ts +++ b/src/vs/workbench/contrib/mergeEditor/browser/view/editors/inputCodeEditorView.ts @@ -140,7 +140,7 @@ export class InputCodeEditorView extends CodeEditorView { } const blockClassNames = ['merge-editor-block']; - const isHandled = model.isHandled(modifiedBaseRange).read(reader); + const isHandled = model.isInputHandled(modifiedBaseRange, this.inputNumber).read(reader); if (isHandled) { blockClassNames.push('handled'); } @@ -261,7 +261,8 @@ export class ModifiedBaseRangeGutterItemModel implements IGutterItemInfo { .getState(this.baseRange) .get() .withInputValue(this.inputNumber, value), - tx + tx, + this.inputNumber ); } public toggleBothSides(): void { @@ -288,7 +289,7 @@ export class ModifiedBaseRangeGutterItemModel implements IGutterItemInfo { const update = (newState: ModifiedBaseRangeState) => { transaction(tx => { /** @description Context Menu: Update Base Range State */ - return this.viewModel.setState(this.baseRange, newState, tx); + return this.viewModel.setState(this.baseRange, newState, tx, this.inputNumber); }); }; diff --git a/src/vs/workbench/contrib/mergeEditor/browser/view/viewModel.ts b/src/vs/workbench/contrib/mergeEditor/browser/view/viewModel.ts index 43e1f2c294a..69bdccfa99e 100644 --- a/src/vs/workbench/contrib/mergeEditor/browser/view/viewModel.ts +++ b/src/vs/workbench/contrib/mergeEditor/browser/view/viewModel.ts @@ -13,7 +13,7 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { INotificationService } from 'vs/platform/notification/common/notification'; import { LineRange } from 'vs/workbench/contrib/mergeEditor/browser/model/lineRange'; import { MergeEditorModel } from 'vs/workbench/contrib/mergeEditor/browser/model/mergeEditorModel'; -import { ModifiedBaseRange, ModifiedBaseRangeState } from 'vs/workbench/contrib/mergeEditor/browser/model/modifiedBaseRange'; +import { InputNumber, ModifiedBaseRange, ModifiedBaseRangeState } from 'vs/workbench/contrib/mergeEditor/browser/model/modifiedBaseRange'; import { BaseCodeEditorView } from 'vs/workbench/contrib/mergeEditor/browser/view/editors/baseCodeEditorView'; import { CodeEditorView } from 'vs/workbench/contrib/mergeEditor/browser/view/editors/codeEditorView'; import { InputCodeEditorView } from 'vs/workbench/contrib/mergeEditor/browser/view/editors/inputCodeEditorView'; @@ -37,6 +37,9 @@ export class MergeEditorViewModel extends Disposable { super(); this._register(resultCodeEditorView.editor.onDidChangeModelContent(e => { + if (this.model.isApplyingEditInResult) { + return; + } transaction(tx => { /** @description Mark conflicts touched by manual edits as handled */ for (const change of e.changes) { @@ -151,10 +154,11 @@ export class MergeEditorViewModel extends Disposable { public setState( baseRange: ModifiedBaseRange, state: ModifiedBaseRangeState, - tx: ITransaction + tx: ITransaction, + inputNumber: InputNumber, ): void { this.manuallySetActiveModifiedBaseRange.set({ range: baseRange, counter: this.counter++ }, tx); - this.model.setState(baseRange, state, true, tx); + this.model.setState(baseRange, state, inputNumber, tx); } private goToConflict(getModifiedBaseRange: (editor: CodeEditorView, curLineNumber: number) => ModifiedBaseRange | undefined): void { @@ -231,7 +235,8 @@ export class MergeEditorViewModel extends Disposable { this.setState( activeModifiedBaseRange, this.model.getState(activeModifiedBaseRange).get().toggle(inputNumber), - tx + tx, + inputNumber, ); }); } @@ -243,7 +248,8 @@ export class MergeEditorViewModel extends Disposable { this.setState( range, this.model.getState(range).get().withInputValue(inputNumber, true), - tx + tx, + inputNumber ); } }); From 8b79a00f9f78443a6aff73c71b11c9beb695127f Mon Sep 17 00:00:00 2001 From: Logan Ramos Date: Thu, 3 Nov 2022 12:34:58 -0400 Subject: [PATCH 080/185] Fix renderHeight being undefined (#165373) --- src/vs/workbench/contrib/timeline/browser/timelinePane.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/timeline/browser/timelinePane.ts b/src/vs/workbench/contrib/timeline/browser/timelinePane.ts index d8c573bc59c..bd10681e642 100644 --- a/src/vs/workbench/contrib/timeline/browser/timelinePane.ts +++ b/src/vs/workbench/contrib/timeline/browser/timelinePane.ts @@ -328,7 +328,7 @@ export class TimelinePane extends ViewPane { let pageSize = this.configurationService.getValue('timeline.pageSize'); if (pageSize === undefined || pageSize === null) { // If we are paging when scrolling, then add an extra item to the end to make sure the "Load more" item is out of view - pageSize = Math.max(20, Math.floor((this.tree.renderHeight / ItemHeight) + (this.pageOnScroll ? 1 : -1))); + pageSize = Math.max(20, Math.floor((this.tree?.renderHeight ?? 0 / ItemHeight) + (this.pageOnScroll ? 1 : -1))); } return pageSize; } From e3d7e621f2e68832764d306fd2b09564a5fed28e Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Thu, 3 Nov 2022 17:35:45 +0100 Subject: [PATCH 081/185] Git - Remove localization from askpass-main (#165129) Remove localization from askpass as it runs in a separate process --- extensions/git/src/askpass-main.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/extensions/git/src/askpass-main.ts b/extensions/git/src/askpass-main.ts index fe6bcdcbeb7..16ac88a56eb 100644 --- a/extensions/git/src/askpass-main.ts +++ b/extensions/git/src/askpass-main.ts @@ -4,11 +4,10 @@ *--------------------------------------------------------------------------------------------*/ import * as fs from 'fs'; -import { l10n } from 'vscode'; import { IPCClient } from './ipc/ipcClient'; function fatal(err: any): void { - console.error(l10n.t('Missing or invalid credentials.')); + console.error('Missing or invalid credentials.'); console.error(err); process.exit(1); } From 1aaf61f6b939b99b71f4213e33c6218e8e5118fa Mon Sep 17 00:00:00 2001 From: Huiwen Date: Fri, 4 Nov 2022 00:53:16 +0800 Subject: [PATCH 082/185] Fix tasks status incorrect #163393 (#163952) --- .../tasks/browser/taskTerminalStatus.ts | 15 +++++---- .../tasks/browser/terminalTaskSystem.ts | 32 +++++++++---------- .../workbench/contrib/tasks/common/tasks.ts | 15 ++++----- 3 files changed, 32 insertions(+), 30 deletions(-) diff --git a/src/vs/workbench/contrib/tasks/browser/taskTerminalStatus.ts b/src/vs/workbench/contrib/tasks/browser/taskTerminalStatus.ts index c38cc7bcc09..762f9f6f578 100644 --- a/src/vs/workbench/contrib/tasks/browser/taskTerminalStatus.ts +++ b/src/vs/workbench/contrib/tasks/browser/taskTerminalStatus.ts @@ -38,7 +38,7 @@ const INFO_TASK_STATUS: ITerminalStatus = { id: TASK_TERMINAL_STATUS_ID, icon: C const INFO_INACTIVE_TASK_STATUS: ITerminalStatus = { id: TASK_TERMINAL_STATUS_ID, icon: Codicon.info, severity: Severity.Info, tooltip: nls.localize('taskTerminalStatus.infosInactive', "Task has infos and is waiting...") }; export class TaskTerminalStatus extends Disposable { - private terminalMap: Map = new Map(); + private terminalMap: Map = new Map(); private _marker: IMarker | undefined; constructor(@ITaskService taskService: ITaskService, @IAudioCueService private readonly _audioCueService: IAudioCueService) { super(); @@ -67,15 +67,15 @@ export class TaskTerminalStatus extends Disposable { this._marker?.dispose(); this._marker = undefined; }); - this.terminalMap.set(task._id, { terminal, task, status, problemMatcher, taskRunEnded: false }); + + this.terminalMap.set(terminal.instanceId, { terminal, task, status, problemMatcher, taskRunEnded: false }); } private terminalFromEvent(event: ITaskEvent): ITerminalData | undefined { - if (!event.__task) { + if (!event.terminalId) { return undefined; } - - return this.terminalMap.get(event.__task._id); + return this.terminalMap.get(event.terminalId); } private eventEnd(event: ITaskEvent) { @@ -130,7 +130,10 @@ export class TaskTerminalStatus extends Disposable { } if (!terminalData.disposeListener) { terminalData.disposeListener = terminalData.terminal.onDisposed(() => { - this.terminalMap.delete(event.__task?._id!); + if (!event.terminalId) { + return; + } + this.terminalMap.delete(event.terminalId); terminalData.disposeListener?.dispose(); }); } diff --git a/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts b/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts index dc338208813..0a35133ca7d 100644 --- a/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts +++ b/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts @@ -468,13 +468,13 @@ export class TerminalTaskSystem extends Disposable implements ITaskSystem { return new Promise((resolve, reject) => { const terminal = activeTerminal.terminal; terminal.onDisposed(terminal => { - this._fireTaskEvent({ kind: TaskEventKind.Terminated, __task: task, exitReason: terminal.exitReason }); + this._fireTaskEvent(TaskEvent.create(TaskEventKind.Terminated, task, terminal.instanceId, terminal.exitReason)); }); const onExit = terminal.onExit(() => { const task = activeTerminal.task; try { onExit.dispose(); - this._fireTaskEvent(TaskEvent.create(TaskEventKind.Terminated, task)); + this._fireTaskEvent(TaskEvent.create(TaskEventKind.Terminated, task, terminal.instanceId, terminal.exitReason)); } catch (error) { // Do nothing. } @@ -494,7 +494,7 @@ export class TerminalTaskSystem extends Disposable implements ITaskSystem { const task = terminalData.task; try { onExit.dispose(); - this._fireTaskEvent(TaskEvent.create(TaskEventKind.Terminated, task)); + this._fireTaskEvent(TaskEvent.create(TaskEventKind.Terminated, task, terminal.instanceId, terminal.exitReason)); } catch (error) { // Do nothing. } @@ -843,13 +843,13 @@ export class TerminalTaskSystem extends Disposable implements ITaskSystem { if (event.kind === ProblemCollectorEventKind.BackgroundProcessingBegins) { eventCounter++; this._busyTasks[mapKey] = task; - this._fireTaskEvent(TaskEvent.create(TaskEventKind.Active, task)); + this._fireTaskEvent(TaskEvent.create(TaskEventKind.Active, task, terminal?.instanceId)); } else if (event.kind === ProblemCollectorEventKind.BackgroundProcessingEnds) { eventCounter--; if (this._busyTasks[mapKey]) { delete this._busyTasks[mapKey]; } - this._fireTaskEvent(TaskEvent.create(TaskEventKind.Inactive, task)); + this._fireTaskEvent(TaskEvent.create(TaskEventKind.Inactive, task, terminal?.instanceId)); if (eventCounter === 0) { if ((watchingProblemMatcher.numberOfMatches > 0) && watchingProblemMatcher.maxMarkerSeverity && (watchingProblemMatcher.maxMarkerSeverity >= MarkerSeverity.Error)) { @@ -880,13 +880,13 @@ export class TerminalTaskSystem extends Disposable implements ITaskSystem { let processStartedSignaled = false; terminal.processReady.then(() => { if (!processStartedSignaled) { - this._fireTaskEvent(TaskEvent.create(TaskEventKind.ProcessStarted, task, terminal!.processId!)); + this._fireTaskEvent(TaskEvent.create(TaskEventKind.ProcessStarted, task, terminal!.instanceId, terminal!.processId!)); processStartedSignaled = true; } }, (_error) => { this._logService.error('Task terminal process never got ready'); }); - this._fireTaskEvent(TaskEvent.create(TaskEventKind.Start, task, terminal.instanceId)); + this._fireTaskEvent(TaskEvent.create(TaskEventKind.Start, task, terminal.instanceId, resolver.values)); const onData = terminal.onLineData((line) => { watchingProblemMatcher.processLine(line); if (!delayer) { @@ -933,13 +933,13 @@ export class TerminalTaskSystem extends Disposable implements ITaskSystem { watchingProblemMatcher.done(); watchingProblemMatcher.dispose(); if (!processStartedSignaled) { - this._fireTaskEvent(TaskEvent.create(TaskEventKind.ProcessStarted, task, terminal!.processId!)); + this._fireTaskEvent(TaskEvent.create(TaskEventKind.ProcessStarted, task, terminal!.instanceId, terminal!.processId!)); processStartedSignaled = true; } - this._fireTaskEvent(TaskEvent.create(TaskEventKind.ProcessEnded, task, exitCode ?? undefined)); + this._fireTaskEvent(TaskEvent.create(TaskEventKind.ProcessEnded, task, terminal!.instanceId, exitCode)); for (let i = 0; i < eventCounter; i++) { - this._fireTaskEvent(TaskEvent.create(TaskEventKind.Inactive, task)); + this._fireTaskEvent(TaskEvent.create(TaskEventKind.Inactive, task, terminal!.instanceId)); } eventCounter = 0; this._fireTaskEvent(TaskEvent.create(TaskEventKind.End, task)); @@ -975,7 +975,7 @@ export class TerminalTaskSystem extends Disposable implements ITaskSystem { let processStartedSignaled = false; terminal.processReady.then(() => { if (!processStartedSignaled) { - this._fireTaskEvent(TaskEvent.create(TaskEventKind.ProcessStarted, task, terminal!.processId!)); + this._fireTaskEvent(TaskEvent.create(TaskEventKind.ProcessStarted, task, terminal!.instanceId, terminal!.processId!)); processStartedSignaled = true; } }, (_error) => { @@ -984,7 +984,7 @@ export class TerminalTaskSystem extends Disposable implements ITaskSystem { this._fireTaskEvent(TaskEvent.create(TaskEventKind.Start, task, terminal.instanceId, resolver.values)); const mapKey = task.getMapKey(); this._busyTasks[mapKey] = task; - this._fireTaskEvent(TaskEvent.create(TaskEventKind.Active, task)); + this._fireTaskEvent(TaskEvent.create(TaskEventKind.Active, task, terminal.instanceId)); const problemMatchers = await this._resolveMatchers(resolver, task.configurationProperties.problemMatchers); const startStopProblemMatcher = new StartStopProblemCollector(problemMatchers, this._markerService, this._modelService, ProblemHandlingStrategy.Clean, this._fileService); this._terminalStatusManager.addTerminal(task, terminal, startStopProblemMatcher); @@ -1031,16 +1031,16 @@ export class TerminalTaskSystem extends Disposable implements ITaskSystem { startStopProblemMatcher.dispose(); }, 100); if (!processStartedSignaled && terminal) { - this._fireTaskEvent(TaskEvent.create(TaskEventKind.ProcessStarted, task, terminal.processId!)); + this._fireTaskEvent(TaskEvent.create(TaskEventKind.ProcessStarted, task, terminal.instanceId, terminal.processId!)); processStartedSignaled = true; } - this._fireTaskEvent(TaskEvent.create(TaskEventKind.ProcessEnded, task, exitCode ?? undefined)); + this._fireTaskEvent(TaskEvent.create(TaskEventKind.ProcessEnded, task, terminal?.instanceId, exitCode ?? undefined)); if (this._busyTasks[mapKey]) { delete this._busyTasks[mapKey]; } - this._fireTaskEvent(TaskEvent.create(TaskEventKind.Inactive, task)); - this._fireTaskEvent(TaskEvent.create(TaskEventKind.End, task)); + this._fireTaskEvent(TaskEvent.create(TaskEventKind.Inactive, task, terminal?.instanceId)); + this._fireTaskEvent(TaskEvent.create(TaskEventKind.End, task, terminal?.instanceId)); resolve({ exitCode: exitCode ?? undefined }); }); }); diff --git a/src/vs/workbench/contrib/tasks/common/tasks.ts b/src/vs/workbench/contrib/tasks/common/tasks.ts index c53dd0ea644..7e45e328082 100644 --- a/src/vs/workbench/contrib/tasks/common/tasks.ts +++ b/src/vs/workbench/contrib/tasks/common/tasks.ts @@ -1139,11 +1139,11 @@ export const enum TaskRunSource { } export namespace TaskEvent { - export function create(kind: TaskEventKind.ProcessStarted | TaskEventKind.ProcessEnded, task: Task, processIdOrExitCode?: number): ITaskEvent; + export function create(kind: TaskEventKind.ProcessStarted | TaskEventKind.ProcessEnded, task: Task, terminalId?: number, processIdOrExitCode?: number): ITaskEvent; export function create(kind: TaskEventKind.Start, task: Task, terminalId?: number, resolvedVariables?: Map): ITaskEvent; - export function create(kind: TaskEventKind.AcquiredInput | TaskEventKind.DependsOnStarted | TaskEventKind.Start | TaskEventKind.Active | TaskEventKind.Inactive | TaskEventKind.Terminated | TaskEventKind.End, task: Task, exitReason?: TerminalExitReason): ITaskEvent; + export function create(kind: TaskEventKind.AcquiredInput | TaskEventKind.DependsOnStarted | TaskEventKind.Active | TaskEventKind.Inactive | TaskEventKind.Terminated | TaskEventKind.End, task: Task, terminalId?: number, exitReason?: TerminalExitReason): ITaskEvent; export function create(kind: TaskEventKind.Changed): ITaskEvent; - export function create(kind: TaskEventKind, task?: Task, processIdOrExitCodeOrTerminalId?: number, resolvedVariables?: Map, exitReason?: TerminalExitReason): ITaskEvent { + export function create(kind: TaskEventKind, task?: Task, terminalId?: number, resolvedVariablesORProcessIdOrExitCodeOrExitReason?: number | Map | TerminalExitReason): ITaskEvent { if (task) { const result: ITaskEvent = { kind: kind, @@ -1153,16 +1153,15 @@ export namespace TaskEvent { group: task.configurationProperties.group, processId: undefined as number | undefined, exitCode: undefined as number | undefined, - terminalId: undefined as number | undefined, + terminalId, __task: task }; if (kind === TaskEventKind.Start) { - result.terminalId = processIdOrExitCodeOrTerminalId; - result.resolvedVariables = resolvedVariables; + result.resolvedVariables = resolvedVariablesORProcessIdOrExitCodeOrExitReason as Map; } else if (kind === TaskEventKind.ProcessStarted) { - result.processId = processIdOrExitCodeOrTerminalId; + result.processId = resolvedVariablesORProcessIdOrExitCodeOrExitReason as number; } else if (kind === TaskEventKind.ProcessEnded) { - result.exitCode = processIdOrExitCodeOrTerminalId; + result.exitCode = resolvedVariablesORProcessIdOrExitCodeOrExitReason as number; } return Object.freeze(result); } else { From bd254f97021c1638edc142522cafbb99201d12cd Mon Sep 17 00:00:00 2001 From: Mingpan Date: Thu, 3 Nov 2022 17:59:44 +0100 Subject: [PATCH 083/185] Fix arrows in side-by-side diff view --- src/vs/editor/browser/widget/diffEditorWidget.ts | 10 ++++++++-- .../contrib/notebook/browser/diff/diffComponents.ts | 1 + 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/vs/editor/browser/widget/diffEditorWidget.ts b/src/vs/editor/browser/widget/diffEditorWidget.ts index 64dd9abc912..ed85bb8681f 100644 --- a/src/vs/editor/browser/widget/diffEditorWidget.ts +++ b/src/vs/editor/browser/widget/diffEditorWidget.ts @@ -610,7 +610,12 @@ export class DiffEditorWidget extends Disposable implements editorBrowser.IDiffE this._register(editor.onMouseDown(event => { if (!event.event.rightButton && event.target.position && event.target.element?.className.includes('arrow-revert-change')) { const lineNumber = event.target.position.lineNumber; - const change = this._diffComputationResult?.changes.find(c => c.modifiedStartLineNumber === lineNumber - 1 || c.modifiedStartLineNumber === lineNumber); + const viewZone = event.target as editorBrowser.IMouseTargetViewZone | undefined; + const change = this._diffComputationResult?.changes.find(c => + // delete change + viewZone?.detail.afterLineNumber === c.modifiedStartLineNumber || + // other changes + (c.modifiedEndLineNumber > 0 && c.modifiedStartLineNumber === lineNumber)); if (change) { this.revertChange(change); } @@ -1208,7 +1213,8 @@ export class DiffEditorWidget extends Disposable implements editorBrowser.IDiffE const foreignOriginal = this._originalEditorState.getForeignViewZones(this._originalEditor.getWhitespaces()); const foreignModified = this._modifiedEditorState.getForeignViewZones(this._modifiedEditor.getWhitespaces()); - const diffDecorations = this._strategy.getEditorsDiffDecorations(lineChanges, this._options.ignoreTrimWhitespace, this._options.renderIndicators, this._options.renderMarginRevertIcon, foreignOriginal, foreignModified); + const renderMarginRevertIcon = this._options.renderMarginRevertIcon && !this._modifiedEditor.getOption(EditorOption.readOnly); + const diffDecorations = this._strategy.getEditorsDiffDecorations(lineChanges, this._options.ignoreTrimWhitespace, this._options.renderIndicators, renderMarginRevertIcon, foreignOriginal, foreignModified); try { this._currentlyChangingViewZones = true; diff --git a/src/vs/workbench/contrib/notebook/browser/diff/diffComponents.ts b/src/vs/workbench/contrib/notebook/browser/diff/diffComponents.ts index e3a628d0d87..4b8b3aa7841 100644 --- a/src/vs/workbench/contrib/notebook/browser/diff/diffComponents.ts +++ b/src/vs/workbench/contrib/notebook/browser/diff/diffComponents.ts @@ -94,6 +94,7 @@ export const fixedDiffEditorOptions: IDiffEditorConstructionOptions = { glyphMargin: true, enableSplitViewResizing: false, renderIndicators: true, + renderMarginRevertIcon: false, readOnly: false, isInEmbeddedEditor: true, renderOverviewRuler: false, From 5440af45a4e850cc2b9c3a36fb6c41994dc92ee9 Mon Sep 17 00:00:00 2001 From: Raymond Zhao <7199958+rzhao271@users.noreply.github.com> Date: Thu, 3 Nov 2022 10:14:03 -0700 Subject: [PATCH 084/185] Reduce unused exports, ref #164939 (#165389) --- src/vs/base/browser/ui/iconLabel/iconLabelHover.ts | 2 +- src/vs/workbench/contrib/emmet/browser/emmetActions.ts | 2 +- .../contrib/preferences/browser/settingsTree.ts | 10 +++++----- .../workbench/services/layout/browser/layoutService.ts | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/vs/base/browser/ui/iconLabel/iconLabelHover.ts b/src/vs/base/browser/ui/iconLabel/iconLabelHover.ts index 41e4c168286..d380683b564 100644 --- a/src/vs/base/browser/ui/iconLabel/iconLabelHover.ts +++ b/src/vs/base/browser/ui/iconLabel/iconLabelHover.ts @@ -37,7 +37,7 @@ type IResolvedHoverContent = IMarkdownString | string | HTMLElement | undefined; * Copied from src\vs\workbench\services\hover\browser\hover.ts * @deprecated Use IHoverService */ -export interface IHoverAction { +interface IHoverAction { label: string; commandId: string; iconClass?: string; diff --git a/src/vs/workbench/contrib/emmet/browser/emmetActions.ts b/src/vs/workbench/contrib/emmet/browser/emmetActions.ts index 95bbfe3d823..2ac7efadc90 100644 --- a/src/vs/workbench/contrib/emmet/browser/emmetActions.ts +++ b/src/vs/workbench/contrib/emmet/browser/emmetActions.ts @@ -42,7 +42,7 @@ class GrammarContributions implements IGrammarContributions { } } -export interface IEmmetActionOptions extends IActionOptions { +interface IEmmetActionOptions extends IActionOptions { actionName: string; } diff --git a/src/vs/workbench/contrib/preferences/browser/settingsTree.ts b/src/vs/workbench/contrib/preferences/browser/settingsTree.ts index 4fa2edb2ff0..2a4fe8a7296 100644 --- a/src/vs/workbench/contrib/preferences/browser/settingsTree.ts +++ b/src/vs/workbench/contrib/preferences/browser/settingsTree.ts @@ -1119,7 +1119,7 @@ export class SettingComplexRenderer extends AbstractSettingRenderer implements I } } -export class SettingArrayRenderer extends AbstractSettingRenderer implements ITreeRenderer { +class SettingArrayRenderer extends AbstractSettingRenderer implements ITreeRenderer { templateId = SETTINGS_ARRAY_TEMPLATE_ID; renderTemplate(container: HTMLElement): ISettingListItemTemplate { @@ -1335,7 +1335,7 @@ abstract class AbstractSettingObjectRenderer extends AbstractSettingRenderer imp } } -export class SettingObjectRenderer extends AbstractSettingObjectRenderer implements ITreeRenderer { +class SettingObjectRenderer extends AbstractSettingObjectRenderer implements ITreeRenderer { override templateId = SETTINGS_OBJECT_TEMPLATE_ID; renderTemplate(container: HTMLElement): ISettingObjectItemTemplate { @@ -1380,7 +1380,7 @@ export class SettingObjectRenderer extends AbstractSettingObjectRenderer impleme } } -export class SettingBoolObjectRenderer extends AbstractSettingObjectRenderer implements ITreeRenderer { +class SettingBoolObjectRenderer extends AbstractSettingObjectRenderer implements ITreeRenderer { override templateId = SETTINGS_BOOL_OBJECT_TEMPLATE_ID; renderTemplate(container: HTMLElement): ISettingObjectItemTemplate { @@ -1550,7 +1550,7 @@ abstract class AbstractSettingTextRenderer extends AbstractSettingRenderer imple } } -export class SettingTextRenderer extends AbstractSettingTextRenderer implements ITreeRenderer { +class SettingTextRenderer extends AbstractSettingTextRenderer implements ITreeRenderer { templateId = SETTINGS_TEXT_TEMPLATE_ID; override renderTemplate(_container: HTMLElement): ISettingTextItemTemplate { @@ -1568,7 +1568,7 @@ export class SettingTextRenderer extends AbstractSettingTextRenderer implements } } -export class SettingMultilineTextRenderer extends AbstractSettingTextRenderer implements ITreeRenderer { +class SettingMultilineTextRenderer extends AbstractSettingTextRenderer implements ITreeRenderer { templateId = SETTINGS_MULTILINE_TEXT_TEMPLATE_ID; override renderTemplate(_container: HTMLElement): ISettingTextItemTemplate { diff --git a/src/vs/workbench/services/layout/browser/layoutService.ts b/src/vs/workbench/services/layout/browser/layoutService.ts index e6b685455d5..f572b4c19a2 100644 --- a/src/vs/workbench/services/layout/browser/layoutService.ts +++ b/src/vs/workbench/services/layout/browser/layoutService.ts @@ -56,7 +56,7 @@ export function positionFromString(str: string): Position { return positionsByString[str]; } -export function panelOpensMaximizedSettingToString(setting: PanelOpensMaximizedOptions): string { +function panelOpensMaximizedSettingToString(setting: PanelOpensMaximizedOptions): string { switch (setting) { case PanelOpensMaximizedOptions.ALWAYS: return 'always'; case PanelOpensMaximizedOptions.NEVER: return 'never'; From db48079fd164f2858266ec7c305e0a7f72fce78c Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Thu, 3 Nov 2022 18:15:23 +0100 Subject: [PATCH 085/185] last folding range not restored (#165390) * last folding range not restored * Update src/vs/editor/contrib/folding/browser/foldingRanges.ts Co-authored-by: Tyler James Leonhardt * Update src/vs/editor/contrib/folding/browser/foldingRanges.ts Co-authored-by: Tyler James Leonhardt * Update src/vs/editor/contrib/folding/browser/foldingRanges.ts Co-authored-by: Tyler James Leonhardt Co-authored-by: Tyler James Leonhardt --- .../editor/contrib/folding/browser/foldingModel.ts | 6 +++++- .../editor/contrib/folding/browser/foldingRanges.ts | 13 +++++++------ 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/vs/editor/contrib/folding/browser/foldingModel.ts b/src/vs/editor/contrib/folding/browser/foldingModel.ts index 3b212ff6abb..543df693162 100644 --- a/src/vs/editor/contrib/folding/browser/foldingModel.ts +++ b/src/vs/editor/contrib/folding/browser/foldingModel.ts @@ -183,8 +183,12 @@ export class FoldingModel { public getMemento(): CollapseMemento | undefined { const foldedOrManualRanges = this._currentFoldedOrManualRanges(); const result: ILineMemento[] = []; + const maxLineNumber = this._textModel.getLineCount(); for (let i = 0, limit = foldedOrManualRanges.length; i < limit; i++) { const range = foldedOrManualRanges[i]; + if (range.startLineNumber >= range.endLineNumber || range.startLineNumber < 1 || range.endLineNumber > maxLineNumber) { + continue; + } const checksum = this._getLinesChecksum(range.startLineNumber + 1, range.endLineNumber); result.push({ startLineNumber: range.startLineNumber, @@ -207,7 +211,7 @@ export class FoldingModel { const rangesToRestore: FoldRange[] = []; const maxLineNumber = this._textModel.getLineCount(); for (const range of state) { - if (range.startLineNumber >= range.endLineNumber || range.startLineNumber < 1 || range.endLineNumber >= maxLineNumber) { + if (range.startLineNumber >= range.endLineNumber || range.startLineNumber < 1 || range.endLineNumber > maxLineNumber) { continue; } const checksum = this._getLinesChecksum(range.startLineNumber + 1, range.endLineNumber); diff --git a/src/vs/editor/contrib/folding/browser/foldingRanges.ts b/src/vs/editor/contrib/folding/browser/foldingRanges.ts index 8beb820778d..5c800345b48 100644 --- a/src/vs/editor/contrib/folding/browser/foldingRanges.ts +++ b/src/vs/editor/contrib/folding/browser/foldingRanges.ts @@ -14,6 +14,12 @@ export const enum FoldSource { recovered = 2 } +export const foldSourceAbbr = { + [FoldSource.provider]: ' ', + [FoldSource.userDefined]: 'u', + [FoldSource.recovered]: 'r', +}; + export interface FoldRange { startLineNumber: number; endLineNumber: number; @@ -230,16 +236,11 @@ export class FoldingRegions { return -1; } - private readonly sourceAbbr = { - [FoldSource.provider]: ' ', - [FoldSource.userDefined]: 'u', - [FoldSource.recovered]: 'r', - }; public toString() { const res: string[] = []; for (let i = 0; i < this.length; i++) { - res[i] = `[${this.sourceAbbr[this.getSource(i)]}${this.isCollapsed(i) ? '+' : '-'}] ${this.getStartLineNumber(i)}/${this.getEndLineNumber(i)}`; + res[i] = `[${foldSourceAbbr[this.getSource(i)]}${this.isCollapsed(i) ? '+' : '-'}] ${this.getStartLineNumber(i)}/${this.getEndLineNumber(i)}`; } return res.join(', '); } From bc1088e8a5ccb370e0154ae8189df452060906b6 Mon Sep 17 00:00:00 2001 From: SteVen Batten <6561887+sbatten@users.noreply.github.com> Date: Thu, 3 Nov 2022 10:25:08 -0700 Subject: [PATCH 086/185] proper check for WCO (#165384) fixes #165337 --- .../electron-sandbox/parts/titlebar/titlebarPart.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/electron-sandbox/parts/titlebar/titlebarPart.ts b/src/vs/workbench/electron-sandbox/parts/titlebar/titlebarPart.ts index 5e994b0de02..35899ccaa86 100644 --- a/src/vs/workbench/electron-sandbox/parts/titlebar/titlebarPart.ts +++ b/src/vs/workbench/electron-sandbox/parts/titlebar/titlebarPart.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { getZoomFactor } from 'vs/base/browser/browser'; +import { getZoomFactor, isWCOVisible } from 'vs/base/browser/browser'; import { $, addDisposableListener, append, EventType, hide, show } from 'vs/base/browser/dom'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IConfigurationService, IConfigurationChangeEvent } from 'vs/platform/configuration/common/configuration'; @@ -165,8 +165,7 @@ export class TitlebarPart extends BrowserTitleBarPart { } // Window Controls (Native Windows/Linux) - const hasWindowControlsOverlay = typeof (navigator as any).windowControlsOverlay !== 'undefined'; - if (!isMacintosh && getTitleBarStyle(this.configurationService) !== 'native' && !hasWindowControlsOverlay && this.windowControls) { + if (!isMacintosh && getTitleBarStyle(this.configurationService) !== 'native' && !isWCOVisible() && this.windowControls) { // Minimize const minimizeIcon = append(this.windowControls, $('div.window-icon.window-minimize' + Codicon.chromeMinimize.cssSelector)); this._register(addDisposableListener(minimizeIcon, EventType.CLICK, e => { From 98546b22876d986b828a9028969f84822655dca3 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 3 Nov 2022 18:32:37 +0100 Subject: [PATCH 087/185] eslint: add a new rule to enforce `declare _serviceBrand: undefined` (#165396) --- .eslintplugin/code-declare-service-brand.ts | 27 +++++++++++++++++++ .eslintrc.json | 3 ++- .../browser/editSessionsStorageService.ts | 2 +- 3 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 .eslintplugin/code-declare-service-brand.ts diff --git a/.eslintplugin/code-declare-service-brand.ts b/.eslintplugin/code-declare-service-brand.ts new file mode 100644 index 00000000000..402d3638e7a --- /dev/null +++ b/.eslintplugin/code-declare-service-brand.ts @@ -0,0 +1,27 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as eslint from 'eslint'; + +export = new class DeclareServiceBrand implements eslint.Rule.RuleModule { + + readonly meta: eslint.Rule.RuleMetaData = { + fixable: 'code' + }; + + create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener { + return { + ['PropertyDefinition[key.name="_serviceBrand"][value]']: (node: any) => { + return context.report({ + node, + message: `The '_serviceBrand'-property should not have a value`, + fix: (fixer) => { + return fixer.replaceText(node, 'declare _serviceBrand: undefined;') + } + }); + } + }; + } +}; diff --git a/.eslintrc.json b/.eslintrc.json index 9b8f2c61094..3b8d12542e5 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -72,6 +72,7 @@ "local/code-no-nls-in-standalone-editor": "warn", "local/code-no-standalone-editor": "warn", "local/code-no-unexternalized-strings": "warn", + "local/code-declare-service-brand": "warn", "local/code-layering": [ "warn", { @@ -331,7 +332,7 @@ "vs/base/parts/*/~", "vs/platform/*/~", "tas-client-umd", // node module allowed even in /common/ - "@microsoft/1ds-core-js",// node module allowed even in /common/ + "@microsoft/1ds-core-js", // node module allowed even in /common/ "@microsoft/1ds-post-js" // node module allowed even in /common/ ] }, diff --git a/src/vs/workbench/contrib/editSessions/browser/editSessionsStorageService.ts b/src/vs/workbench/contrib/editSessions/browser/editSessionsStorageService.ts index ecbacefb8a7..84c9fc8b93c 100644 --- a/src/vs/workbench/contrib/editSessions/browser/editSessionsStorageService.ts +++ b/src/vs/workbench/contrib/editSessions/browser/editSessionsStorageService.ts @@ -35,7 +35,7 @@ type AuthenticationProviderOption = IQuickPickItem & { provider: IAuthentication const configureContinueOnPreference = { iconClass: Codicon.settingsGear.classNames, tooltip: localize('configure continue on', 'Configure this preference in settings') }; export class EditSessionsWorkbenchService extends Disposable implements IEditSessionsStorageService { - _serviceBrand = undefined; + declare _serviceBrand: undefined; private serverConfiguration = this.productService['editSessions.store']; private storeClient: EditSessionsStoreClient | undefined; From e8eb39bac26ddc87f27ed69fa06c54cd230d18f9 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 3 Nov 2022 18:52:14 +0100 Subject: [PATCH 088/185] debt: move or remove `NullXYZServices` (#165397) We have a few NullXYZServices. Those are useful for testing but we should move them to separate files so that we don't end up shipping them with the product --- extensions/references-view/yarn.lock | 5 ----- .../contrib/hover/browser/marginHover.ts | 4 ++-- .../browser/services/openerService.test.ts | 3 ++- src/vs/editor/test/browser/testCodeEditor.ts | 3 ++- .../actions/test/common/menuService.test.ts | 2 +- src/vs/platform/commands/common/commands.ts | 11 +---------- .../test/common/nullCommandService.ts | 16 ++++++++++++++++ src/vs/platform/opener/common/opener.ts | 13 +------------ .../opener/test/common/nullOpenerService.ts | 19 +++++++++++++++++++ .../services/lifecycle/common/lifecycle.ts | 17 ----------------- 10 files changed, 44 insertions(+), 49 deletions(-) create mode 100644 src/vs/platform/commands/test/common/nullCommandService.ts create mode 100644 src/vs/platform/opener/test/common/nullOpenerService.ts diff --git a/extensions/references-view/yarn.lock b/extensions/references-view/yarn.lock index 1661be7c5d2..4b3f8a1f7a0 100644 --- a/extensions/references-view/yarn.lock +++ b/extensions/references-view/yarn.lock @@ -6,8 +6,3 @@ version "16.11.33" resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.33.tgz#566713b1b626f781c5c58fe3531307283e00720c" integrity sha512-0PJ0vg+JyU0MIan58IOIFRtSvsb7Ri+7Wltx2qAg94eMOrpg4+uuP3aUHCpxXc1i0jCXiC+zIamSZh3l9AbcQA== - -vscode-nls@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-5.2.0.tgz#3cb6893dd9bd695244d8a024bdf746eea665cc3f" - integrity sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng== diff --git a/src/vs/editor/contrib/hover/browser/marginHover.ts b/src/vs/editor/contrib/hover/browser/marginHover.ts index 848ecb9bba5..deac3bff8e9 100644 --- a/src/vs/editor/contrib/hover/browser/marginHover.ts +++ b/src/vs/editor/contrib/hover/browser/marginHover.ts @@ -12,7 +12,7 @@ import { ICodeEditor, IOverlayWidget, IOverlayWidgetPosition } from 'vs/editor/b import { ConfigurationChangedEvent, EditorOption } from 'vs/editor/common/config/editorOptions'; import { ILanguageService } from 'vs/editor/common/languages/language'; import { HoverOperation, HoverStartMode, IHoverComputer } from 'vs/editor/contrib/hover/browser/hoverOperation'; -import { IOpenerService, NullOpenerService } from 'vs/platform/opener/common/opener'; +import { IOpenerService } from 'vs/platform/opener/common/opener'; import { HoverWidget } from 'vs/base/browser/ui/hover/hoverWidget'; const $ = dom.$; @@ -39,7 +39,7 @@ export class MarginHoverWidget extends Disposable implements IOverlayWidget { constructor( editor: ICodeEditor, languageService: ILanguageService, - openerService: IOpenerService = NullOpenerService, + openerService: IOpenerService, ) { super(); this._editor = editor; diff --git a/src/vs/editor/test/browser/services/openerService.test.ts b/src/vs/editor/test/browser/services/openerService.test.ts index c1f94e52e28..d823f89d285 100644 --- a/src/vs/editor/test/browser/services/openerService.test.ts +++ b/src/vs/editor/test/browser/services/openerService.test.ts @@ -7,7 +7,8 @@ import { Disposable } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; import { OpenerService } from 'vs/editor/browser/services/openerService'; import { TestCodeEditorService } from 'vs/editor/test/browser/editorTestServices'; -import { CommandsRegistry, ICommandService, NullCommandService } from 'vs/platform/commands/common/commands'; +import { CommandsRegistry, ICommandService } from 'vs/platform/commands/common/commands'; +import { NullCommandService } from 'vs/platform/commands/test/common/nullCommandService'; import { ITextEditorOptions } from 'vs/platform/editor/common/editor'; import { matchesScheme, matchesSomeScheme } from 'vs/platform/opener/common/opener'; import { TestThemeService } from 'vs/platform/theme/test/common/testThemeService'; diff --git a/src/vs/editor/test/browser/testCodeEditor.ts b/src/vs/editor/test/browser/testCodeEditor.ts index 9278f28c685..b9f488595a2 100644 --- a/src/vs/editor/test/browser/testCodeEditor.ts +++ b/src/vs/editor/test/browser/testCodeEditor.ts @@ -47,7 +47,8 @@ import { MockContextKeyService } from 'vs/platform/keybinding/test/common/mockKe import { ILogService, NullLogService } from 'vs/platform/log/common/log'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { TestNotificationService } from 'vs/platform/notification/test/common/testNotificationService'; -import { IOpenerService, NullOpenerService } from 'vs/platform/opener/common/opener'; +import { IOpenerService } from 'vs/platform/opener/common/opener'; +import { NullOpenerService } from 'vs/platform/opener/test/common/nullOpenerService'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { NullTelemetryServiceShape } from 'vs/platform/telemetry/common/telemetryUtils'; import { IThemeService } from 'vs/platform/theme/common/themeService'; diff --git a/src/vs/platform/actions/test/common/menuService.test.ts b/src/vs/platform/actions/test/common/menuService.test.ts index 99b108e152e..caf3ad95463 100644 --- a/src/vs/platform/actions/test/common/menuService.test.ts +++ b/src/vs/platform/actions/test/common/menuService.test.ts @@ -8,7 +8,7 @@ import { DisposableStore } from 'vs/base/common/lifecycle'; import { generateUuid } from 'vs/base/common/uuid'; import { isIMenuItem, MenuId, MenuRegistry } from 'vs/platform/actions/common/actions'; import { MenuService } from 'vs/platform/actions/common/menuService'; -import { NullCommandService } from 'vs/platform/commands/common/commands'; +import { NullCommandService } from 'vs/platform/commands/test/common/nullCommandService'; import { MockContextKeyService } from 'vs/platform/keybinding/test/common/mockKeybindingService'; import { InMemoryStorageService } from 'vs/platform/storage/common/storage'; diff --git a/src/vs/platform/commands/common/commands.ts b/src/vs/platform/commands/common/commands.ts index 3a360c8a907..aac43272d8a 100644 --- a/src/vs/platform/commands/common/commands.ts +++ b/src/vs/platform/commands/common/commands.ts @@ -6,7 +6,7 @@ import { Emitter, Event } from 'vs/base/common/event'; import { Iterable } from 'vs/base/common/iterator'; import { IJSONSchema } from 'vs/base/common/jsonSchema'; -import { Disposable, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; +import { IDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { LinkedList } from 'vs/base/common/linkedList'; import { TypeConstraint, validateConstraints } from 'vs/base/common/types'; import { createDecorator, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; @@ -140,13 +140,4 @@ export const CommandsRegistry: ICommandRegistry = new class implements ICommandR } }; -export const NullCommandService: ICommandService = { - _serviceBrand: undefined, - onWillExecuteCommand: () => Disposable.None, - onDidExecuteCommand: () => Disposable.None, - executeCommand() { - return Promise.resolve(undefined); - } -}; - CommandsRegistry.registerCommand('noop', () => { }); diff --git a/src/vs/platform/commands/test/common/nullCommandService.ts b/src/vs/platform/commands/test/common/nullCommandService.ts new file mode 100644 index 00000000000..8c90f77362e --- /dev/null +++ b/src/vs/platform/commands/test/common/nullCommandService.ts @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Disposable } from 'vs/base/common/lifecycle'; +import { ICommandService } from 'vs/platform/commands/common/commands'; + +export const NullCommandService: ICommandService = { + _serviceBrand: undefined, + onWillExecuteCommand: () => Disposable.None, + onDidExecuteCommand: () => Disposable.None, + executeCommand() { + return Promise.resolve(undefined); + } +}; diff --git a/src/vs/platform/opener/common/opener.ts b/src/vs/platform/opener/common/opener.ts index 7478cafd3ab..1996a2c8b49 100644 --- a/src/vs/platform/opener/common/opener.ts +++ b/src/vs/platform/opener/common/opener.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { CancellationToken } from 'vs/base/common/cancellation'; -import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; +import { IDisposable } from 'vs/base/common/lifecycle'; import { equalsIgnoreCase, startsWithIgnoreCase } from 'vs/base/common/strings'; import { URI } from 'vs/base/common/uri'; import { IEditorOptions, ITextEditorSelection } from 'vs/platform/editor/common/editor'; @@ -117,17 +117,6 @@ export interface IOpenerService { resolveExternalUri(resource: URI, options?: ResolveExternalUriOptions): Promise; } -export const NullOpenerService = Object.freeze({ - _serviceBrand: undefined, - registerOpener() { return Disposable.None; }, - registerValidator() { return Disposable.None; }, - registerExternalUriResolver() { return Disposable.None; }, - setDefaultExternalOpener() { }, - registerExternalOpener() { return Disposable.None; }, - async open() { return false; }, - async resolveExternalUri(uri: URI) { return { resolved: uri, dispose() { } }; }, -} as IOpenerService); - export function matchesScheme(target: URI | string, scheme: string): boolean { if (URI.isUri(target)) { return equalsIgnoreCase(target.scheme, scheme); diff --git a/src/vs/platform/opener/test/common/nullOpenerService.ts b/src/vs/platform/opener/test/common/nullOpenerService.ts new file mode 100644 index 00000000000..25b807c1dce --- /dev/null +++ b/src/vs/platform/opener/test/common/nullOpenerService.ts @@ -0,0 +1,19 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Disposable } from 'vs/base/common/lifecycle'; +import { URI } from 'vs/base/common/uri'; +import { IOpenerService } from '../../common/opener'; + +export const NullOpenerService = Object.freeze({ + _serviceBrand: undefined, + registerOpener() { return Disposable.None; }, + registerValidator() { return Disposable.None; }, + registerExternalUriResolver() { return Disposable.None; }, + setDefaultExternalOpener() { }, + registerExternalOpener() { return Disposable.None; }, + async open() { return false; }, + async resolveExternalUri(uri: URI) { return { resolved: uri, dispose() { } }; }, +} as IOpenerService); diff --git a/src/vs/workbench/services/lifecycle/common/lifecycle.ts b/src/vs/workbench/services/lifecycle/common/lifecycle.ts index a8c2c9e2cd6..7a795423d5d 100644 --- a/src/vs/workbench/services/lifecycle/common/lifecycle.ts +++ b/src/vs/workbench/services/lifecycle/common/lifecycle.ts @@ -262,20 +262,3 @@ export interface ILifecycleService { */ shutdown(): Promise; } - -export const NullLifecycleService: ILifecycleService = { - - _serviceBrand: undefined, - - onBeforeShutdown: Event.None, - onBeforeShutdownError: Event.None, - onShutdownVeto: Event.None, - onWillShutdown: Event.None, - onDidShutdown: Event.None, - - phase: LifecyclePhase.Restored, - startupKind: StartupKind.NewWindow, - - async when() { }, - async shutdown() { } -}; From 708cd91201b87ed04a2c69ad07f914f44cda0d71 Mon Sep 17 00:00:00 2001 From: Jean Pierre Date: Thu, 3 Nov 2022 13:26:19 -0500 Subject: [PATCH 089/185] Fixes `Terminal: Focus Terminal Tabs view` command not working (#164408) --- .../contrib/terminal/browser/terminalGroupService.ts | 9 +-------- .../workbench/contrib/terminal/browser/terminalView.ts | 6 ------ 2 files changed, 1 insertion(+), 14 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/browser/terminalGroupService.ts b/src/vs/workbench/contrib/terminal/browser/terminalGroupService.ts index 9835ac1fbca..6c1dd3e609d 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalGroupService.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalGroupService.ts @@ -179,14 +179,7 @@ export class TerminalGroupService extends Disposable implements ITerminalGroupSe if (pane && !pane.isVisible()) { await this._viewsService.openView(TERMINAL_VIEW_ID, focus); } - // Do not await the focus as setVisible must be called immediately to ensure - // something else didn't steal focus - instance.focusWhenReady(true); - // HACK: as a workaround for https://github.com/microsoft/vscode/issues/134692, - // this will trigger a forced refresh of the viewport to sync the viewport and scroll bar. - // This can likely be removed after https://github.com/xtermjs/xterm.js/issues/291 is - // fixed upstream. - instance.setVisible(true); + await instance.focusWhenReady(true); } } this._onDidShow.fire(); diff --git a/src/vs/workbench/contrib/terminal/browser/terminalView.ts b/src/vs/workbench/contrib/terminal/browser/terminalView.ts index 672b8c00cc8..c4ca73abbbb 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalView.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalView.ts @@ -47,7 +47,6 @@ import { ServicesAccessor } from 'vs/editor/browser/editorExtensions'; import { TerminalCapability } from 'vs/platform/terminal/common/capabilities/capabilities'; export class TerminalViewPane extends ViewPane { - private _actions: IAction[] | undefined; private _fontStyleElement: HTMLElement | undefined; private _parentDomElement: HTMLElement | undefined; private _terminalTabbedView?: TerminalTabbedView; @@ -80,11 +79,6 @@ export class TerminalViewPane extends ViewPane { ) { super(options, keybindingService, _contextMenuService, _configurationService, _contextKeyService, viewDescriptorService, _instantiationService, openerService, themeService, telemetryService); this._register(this._terminalService.onDidRegisterProcessSupport(() => { - if (this._actions) { - for (const action of this._actions) { - action.enabled = true; - } - } this._onDidChangeViewWelcomeState.fire(); })); From 78f27b8e32032e2e3c8dbbc783d7f06ec146ac33 Mon Sep 17 00:00:00 2001 From: Raymond Zhao <7199958+rzhao271@users.noreply.github.com> Date: Thu, 3 Nov 2022 11:28:06 -0700 Subject: [PATCH 090/185] Remove redundant CSS rules (#165401) Ref #165169 Ref #157564 After changing workspace trust and policy settings to use indicators, a bunch of CSS rules became redundant. This PR removes those CSS rules. --- .../browser/media/settingsEditor2.css | 18 ------------------ .../preferences/browser/settingsTree.ts | 4 ---- .../preferences/browser/settingsWidgets.ts | 10 ---------- 3 files changed, 32 deletions(-) diff --git a/src/vs/workbench/contrib/preferences/browser/media/settingsEditor2.css b/src/vs/workbench/contrib/preferences/browser/media/settingsEditor2.css index 8e812552853..fdfd3a1cf55 100644 --- a/src/vs/workbench/contrib/preferences/browser/media/settingsEditor2.css +++ b/src/vs/workbench/contrib/preferences/browser/media/settingsEditor2.css @@ -417,22 +417,6 @@ -webkit-user-select: text; } -.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-untrusted > .setting-item-contents .setting-item-trust-description, -.settings-editor > .settings-body .settings-tree-container .setting-item > .setting-item-contents .setting-item-policy-description { - display: flex; - font-weight: 600; - margin: 6px 0 12px 0; -} - -.settings-editor > .settings-body .settings-tree-container .setting-item > .setting-item-contents .setting-item-policy-description[hidden] { - display: none; -} - -.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-untrusted > .setting-item-contents .setting-item-trust-description > span, -.settings-editor > .settings-body .settings-tree-container .setting-item > .setting-item-contents .setting-item-policy-description > span { - padding-right: 5px; -} - .settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-validation-message { display: none; } @@ -472,14 +456,12 @@ margin: 0px; } -.settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-trust-description a:focus, .settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-markdown a:focus { outline: 1px solid -webkit-focus-ring-color; outline-offset: -1px; text-decoration: underline; } -.settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-trust-description a:hover, .settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-markdown a:hover { cursor: pointer; text-decoration: underline; diff --git a/src/vs/workbench/contrib/preferences/browser/settingsTree.ts b/src/vs/workbench/contrib/preferences/browser/settingsTree.ts index 2a4fe8a7296..0f0d16e3c12 100644 --- a/src/vs/workbench/contrib/preferences/browser/settingsTree.ts +++ b/src/vs/workbench/contrib/preferences/browser/settingsTree.ts @@ -2285,9 +2285,6 @@ export class SettingsTree extends WorkbenchObjectTree { collector.addRule(`.settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-description { color: ${fgWithOpacity}; }`); collector.addRule(`.settings-editor > .settings-body .settings-toc-container .monaco-list-row:not(.selected) { color: ${fgWithOpacity}; }`); - const disabledfgColor = new Color(new RGBA(foregroundColor.rgba.r, foregroundColor.rgba.g, foregroundColor.rgba.b, 0.7)); - collector.addRule(`.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-untrusted > .setting-item-contents .setting-item-description { color: ${disabledfgColor}; }`); - // Hack for subpixel antialiasing collector.addRule(`.settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-title .setting-item-overrides, .settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-title .setting-item-ignored { color: ${fgWithOpacity}; }`); @@ -2338,7 +2335,6 @@ export class SettingsTree extends WorkbenchObjectTree { const focusBorderColor = theme.getColor(focusBorder); if (focusBorderColor) { - collector.addRule(`.settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-trust-description a:focus { outline-color: ${focusBorderColor} }`); collector.addRule(`.settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-markdown a:focus { outline-color: ${focusBorderColor} }`); } })); diff --git a/src/vs/workbench/contrib/preferences/browser/settingsWidgets.ts b/src/vs/workbench/contrib/preferences/browser/settingsWidgets.ts index 728231fd8bb..88a3310bf7f 100644 --- a/src/vs/workbench/contrib/preferences/browser/settingsWidgets.ts +++ b/src/vs/workbench/contrib/preferences/browser/settingsWidgets.ts @@ -14,7 +14,6 @@ import { SelectBox } from 'vs/base/browser/ui/selectBox/selectBox'; import { IAction } from 'vs/base/common/actions'; import { disposableTimeout } from 'vs/base/common/async'; import { Codicon } from 'vs/base/common/codicons'; -import { Color, RGBA } from 'vs/base/common/color'; import { Emitter, Event } from 'vs/base/common/event'; import { KeyCode } from 'vs/base/common/keyCodes'; import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; @@ -49,21 +48,14 @@ registerThemingParticipant((theme: IColorTheme, collector: ICssStyleCollector) = const link = theme.getColor(textLinkForeground); if (link) { - collector.addRule(`.settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-trust-description a { color: ${link}; }`); - collector.addRule(`.settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-trust-description a > code { color: ${link}; }`); collector.addRule(`.settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-markdown a { color: ${link}; }`); collector.addRule(`.settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-markdown a > code { color: ${link}; }`); collector.addRule(`.monaco-select-box-dropdown-container > .select-box-details-pane > .select-box-description-markdown a { color: ${link}; }`); collector.addRule(`.monaco-select-box-dropdown-container > .select-box-details-pane > .select-box-description-markdown a > code { color: ${link}; }`); - - const disabledfgColor = new Color(new RGBA(link.rgba.r, link.rgba.g, link.rgba.b, 0.8)); - collector.addRule(`.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-untrusted > .setting-item-contents .setting-item-markdown a { color: ${disabledfgColor}; }`); } const activeLink = theme.getColor(textLinkActiveForeground); if (activeLink) { - collector.addRule(`.settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-trust-description a:hover, .settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-trust-description a:active { color: ${activeLink}; }`); - collector.addRule(`.settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-trust-description a:hover > code, .settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-trust-description a:active > code { color: ${activeLink}; }`); collector.addRule(`.settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-markdown a:hover, .settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-markdown a:active { color: ${activeLink}; }`); collector.addRule(`.settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-markdown a:hover > code, .settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-markdown a:active > code { color: ${activeLink}; }`); collector.addRule(`.monaco-select-box-dropdown-container > .select-box-details-pane > .select-box-description-markdown a:hover, .monaco-select-box-dropdown-container > .select-box-details-pane > .select-box-description-markdown a:active { color: ${activeLink}; }`); @@ -120,8 +112,6 @@ registerThemingParticipant((theme: IColorTheme, collector: ICssStyleCollector) = if (codeTextForegroundColor) { collector.addRule(`.settings-editor > .settings-body .settings-tree-container .setting-item .setting-item-markdown code { color: ${codeTextForegroundColor} }`); collector.addRule(`.monaco-select-box-dropdown-container > .select-box-details-pane > .select-box-description-markdown code { color: ${codeTextForegroundColor} }`); - const disabledfgColor = new Color(new RGBA(codeTextForegroundColor.rgba.r, codeTextForegroundColor.rgba.g, codeTextForegroundColor.rgba.b, 0.8)); - collector.addRule(`.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-untrusted > .setting-item-contents .setting-item-description .setting-item-markdown code { color: ${disabledfgColor} }`); } const modifiedItemIndicatorColor = theme.getColor(modifiedItemIndicator); From 640bcd7e70ae2296fa7046196b388c3e192c1b95 Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Thu, 3 Nov 2022 20:13:02 +0100 Subject: [PATCH 091/185] Contributed activity's busy icon fails to display after resetting containing TreeView's badge state (#165255) Fixes #165181 --- src/vs/workbench/browser/parts/views/treeView.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/browser/parts/views/treeView.ts b/src/vs/workbench/browser/parts/views/treeView.ts index aca25ef5521..9c2758f630d 100644 --- a/src/vs/workbench/browser/parts/views/treeView.ts +++ b/src/vs/workbench/browser/parts/views/treeView.ts @@ -425,7 +425,7 @@ abstract class AbstractTreeView extends Disposable implements ITreeView { if (badge) { const activity = { badge: new NumberBadge(badge.value, () => badge.tooltip), - priority: 150 + priority: 50 }; this._badgeActivity = this.activityService.showViewActivity(this.id, activity); } From e7e403d83f77cb639a9fdb7847d902e5437dc6f0 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 3 Nov 2022 12:19:54 -0700 Subject: [PATCH 092/185] Bump target for build scripts (#165287) --- build/lib/compilation.js | 7 ++- build/lib/i18n.js | 101 +++++++++++++++++++----------------- build/lib/monaco-api.js | 9 ++++ build/lib/nls.js | 18 ++++--- build/lib/policies.js | 9 ++++ build/lib/reporter.js | 7 +-- build/lib/stats.js | 3 ++ build/lib/treeshaking.js | 6 +++ build/lib/tsb/builder.js | 25 ++++++--- build/lib/tsb/transpiler.js | 101 ++++++++++++++++++++---------------- build/lib/tsb/utils.js | 3 +- build/tsconfig.json | 3 +- 12 files changed, 179 insertions(+), 113 deletions(-) diff --git a/build/lib/compilation.js b/build/lib/compilation.js index f5d46d7b20c..8a5e93cbb4c 100644 --- a/build/lib/compilation.js +++ b/build/lib/compilation.js @@ -122,8 +122,12 @@ function watchTask(out, build) { exports.watchTask = watchTask; const REPO_SRC_FOLDER = path.join(__dirname, '../../src'); class MonacoGenerator { + _isWatch; + stream; + _watchedFiles; + _fsProvider; + _declarationResolver; constructor(isWatch) { - this._executeSoonTimer = null; this._isWatch = isWatch; this.stream = es.through(); this._watchedFiles = {}; @@ -153,6 +157,7 @@ class MonacoGenerator { }); } } + _executeSoonTimer = null; _executeSoon() { if (this._executeSoonTimer !== null) { clearTimeout(this._executeSoonTimer); diff --git a/build/lib/i18n.js b/build/lib/i18n.js index 95338e5befe..b65f27227d5 100644 --- a/build/lib/i18n.js +++ b/build/lib/i18n.js @@ -63,8 +63,8 @@ var BundledFormat; BundledFormat.is = is; })(BundledFormat || (BundledFormat = {})); class Line { + buffer = []; constructor(indent = 0) { - this.buffer = []; if (indent > 0) { this.buffer.push(new Array(indent + 1).join(' ')); } @@ -79,6 +79,7 @@ class Line { } exports.Line = Line; class TextModel { + _lines; constructor(contents) { this._lines = contents.split(/\r\n|\r|\n/); } @@ -87,6 +88,10 @@ class TextModel { } } class XLF { + project; + buffer; + files; + numberOfMessages; constructor(project) { this.project = project; this.buffer = []; @@ -168,55 +173,55 @@ class XLF { line.append(content); this.buffer.push(line.toString()); } + static parse = function (xlfString) { + return new Promise((resolve, reject) => { + const parser = new xml2js.Parser(); + const files = []; + parser.parseString(xlfString, function (err, result) { + if (err) { + reject(new Error(`XLF parsing error: Failed to parse XLIFF string. ${err}`)); + } + const fileNodes = result['xliff']['file']; + if (!fileNodes) { + reject(new Error(`XLF parsing error: XLIFF file does not contain "xliff" or "file" node(s) required for parsing.`)); + } + fileNodes.forEach((file) => { + const name = file.$.original; + if (!name) { + reject(new Error(`XLF parsing error: XLIFF file node does not contain original attribute to determine the original location of the resource file.`)); + } + const language = file.$['target-language']; + if (!language) { + reject(new Error(`XLF parsing error: XLIFF file node does not contain target-language attribute to determine translated language.`)); + } + const messages = {}; + const transUnits = file.body[0]['trans-unit']; + if (transUnits) { + transUnits.forEach((unit) => { + const key = unit.$.id; + if (!unit.target) { + return; // No translation available + } + let val = unit.target[0]; + if (typeof val !== 'string') { + // We allow empty source values so support them for translations as well. + val = val._ ? val._ : ''; + } + if (!key) { + reject(new Error(`XLF parsing error: trans-unit ${JSON.stringify(unit, undefined, 0)} defined in file ${name} is missing the ID attribute.`)); + return; + } + messages[key] = decodeEntities(val); + }); + files.push({ messages, name, language: language.toLowerCase() }); + } + }); + resolve(files); + }); + }); + }; } exports.XLF = XLF; -XLF.parse = function (xlfString) { - return new Promise((resolve, reject) => { - const parser = new xml2js.Parser(); - const files = []; - parser.parseString(xlfString, function (err, result) { - if (err) { - reject(new Error(`XLF parsing error: Failed to parse XLIFF string. ${err}`)); - } - const fileNodes = result['xliff']['file']; - if (!fileNodes) { - reject(new Error(`XLF parsing error: XLIFF file does not contain "xliff" or "file" node(s) required for parsing.`)); - } - fileNodes.forEach((file) => { - const name = file.$.original; - if (!name) { - reject(new Error(`XLF parsing error: XLIFF file node does not contain original attribute to determine the original location of the resource file.`)); - } - const language = file.$['target-language']; - if (!language) { - reject(new Error(`XLF parsing error: XLIFF file node does not contain target-language attribute to determine translated language.`)); - } - const messages = {}; - const transUnits = file.body[0]['trans-unit']; - if (transUnits) { - transUnits.forEach((unit) => { - const key = unit.$.id; - if (!unit.target) { - return; // No translation available - } - let val = unit.target[0]; - if (typeof val !== 'string') { - // We allow empty source values so support them for translations as well. - val = val._ ? val._ : ''; - } - if (!key) { - reject(new Error(`XLF parsing error: trans-unit ${JSON.stringify(unit, undefined, 0)} defined in file ${name} is missing the ID attribute.`)); - return; - } - messages[key] = decodeEntities(val); - }); - files.push({ messages, name, language: language.toLowerCase() }); - } - }); - resolve(files); - }); - }); -}; function sortLanguages(languages) { return languages.sort((a, b) => { return a.id < b.id ? -1 : (a.id > b.id ? 1 : 0); diff --git a/build/lib/monaco-api.js b/build/lib/monaco-api.js index a7542b711df..adabc35e711 100644 --- a/build/lib/monaco-api.js +++ b/build/lib/monaco-api.js @@ -492,12 +492,17 @@ class FSProvider { } exports.FSProvider = FSProvider; class CacheEntry { + sourceFile; + mtime; constructor(sourceFile, mtime) { this.sourceFile = sourceFile; this.mtime = mtime; } } class DeclarationResolver { + _fsProvider; + ts; + _sourceFileCache; constructor(_fsProvider) { this._fsProvider = _fsProvider; this.ts = require('typescript'); @@ -553,6 +558,10 @@ function run3(resolver) { } exports.run3 = run3; class TypeScriptLanguageServiceHost { + _ts; + _libs; + _files; + _compilerOptions; constructor(ts, libs, files, compilerOptions) { this._ts = ts; this._libs = libs; diff --git a/build/lib/nls.js b/build/lib/nls.js index 7dd43a78207..d8144e33eac 100644 --- a/build/lib/nls.js +++ b/build/lib/nls.js @@ -95,18 +95,22 @@ var _nls; return { line: position.line - 1, character: position.column }; } class SingleFileServiceHost { + options; + filename; + file; + lib; constructor(ts, options, filename, contents) { this.options = options; this.filename = filename; - this.getCompilationSettings = () => this.options; - this.getScriptFileNames = () => [this.filename]; - this.getScriptVersion = () => '1'; - this.getScriptSnapshot = (name) => name === this.filename ? this.file : this.lib; - this.getCurrentDirectory = () => ''; - this.getDefaultLibFileName = () => 'lib.d.ts'; this.file = ts.ScriptSnapshot.fromString(contents); this.lib = ts.ScriptSnapshot.fromString(''); } + getCompilationSettings = () => this.options; + getScriptFileNames = () => [this.filename]; + getScriptVersion = () => '1'; + getScriptSnapshot = (name) => name === this.filename ? this.file : this.lib; + getCurrentDirectory = () => ''; + getDefaultLibFileName = () => 'lib.d.ts'; readFile(path, _encoding) { if (path === this.filename) { return this.file.getText(0, this.file.getLength()); @@ -208,6 +212,8 @@ var _nls; }; } class TextModel { + lines; + lineEndings; constructor(contents) { const regex = /\r\n|\r|\n/g; let index = 0; diff --git a/build/lib/policies.js b/build/lib/policies.js index 37bb8e36d0c..3dcc3c13b36 100644 --- a/build/lib/policies.js +++ b/build/lib/policies.js @@ -41,6 +41,12 @@ function renderADMLString(prefix, moduleName, nlsString, translations) { return `${value}`; } class BasePolicy { + policyType; + name; + category; + minimumVersion; + description; + moduleName; constructor(policyType, name, category, minimumVersion, description, moduleName) { this.policyType = policyType; this.name = name; @@ -96,6 +102,7 @@ class BooleanPolicy extends BasePolicy { } } class IntPolicy extends BasePolicy { + defaultValue; static from(name, category, minimumVersion, description, moduleName, settingNode) { const type = getStringProperty(settingNode, 'type'); if (type !== 'number') { @@ -140,6 +147,8 @@ class StringPolicy extends BasePolicy { } } class StringEnumPolicy extends BasePolicy { + enum_; + enumDescriptions; static from(name, category, minimumVersion, description, moduleName, settingNode) { const type = getStringProperty(settingNode, 'type'); if (type !== 'string') { diff --git a/build/lib/reporter.js b/build/lib/reporter.js index 0c735614324..340f0a5f5ec 100644 --- a/build/lib/reporter.js +++ b/build/lib/reporter.js @@ -12,12 +12,13 @@ const ansiColors = require("ansi-colors"); const fs = require("fs"); const path = require("path"); class ErrorLog { + id; constructor(id) { this.id = id; - this.allErrors = []; - this.startTime = null; - this.count = 0; } + allErrors = []; + startTime = null; + count = 0; onStart() { if (this.count++ > 0) { return; diff --git a/build/lib/stats.js b/build/lib/stats.js index 869ac2043b3..e1315741079 100644 --- a/build/lib/stats.js +++ b/build/lib/stats.js @@ -9,6 +9,9 @@ const es = require("event-stream"); const fancyLog = require("fancy-log"); const ansiColors = require("ansi-colors"); class Entry { + name; + totalCount; + totalSize; constructor(name, totalCount, totalSize) { this.name = name; this.totalCount = totalCount; diff --git a/build/lib/treeshaking.js b/build/lib/treeshaking.js index 029235f7709..b532e425f0d 100644 --- a/build/lib/treeshaking.js +++ b/build/lib/treeshaking.js @@ -163,6 +163,10 @@ function processLibFiles(ts, options) { * A TypeScript language service host */ class TypeScriptLanguageServiceHost { + _ts; + _libs; + _files; + _compilerOptions; constructor(ts, libs, files, compilerOptions) { this._ts = ts; this._libs = libs; @@ -747,6 +751,8 @@ function findSymbolFromHeritageType(ts, checker, type) { return null; } class SymbolImportTuple { + symbol; + symbolImportNode; constructor(symbol, symbolImportNode) { this.symbol = symbol; this.symbolImportNode = symbolImportNode; diff --git a/build/lib/tsb/builder.js b/build/lib/tsb/builder.js index be74a30a17a..1476a345523 100644 --- a/build/lib/tsb/builder.js +++ b/build/lib/tsb/builder.js @@ -299,6 +299,8 @@ function createTypeScriptBuilder(config, projectFile, cmd) { } exports.createTypeScriptBuilder = createTypeScriptBuilder; class ScriptSnapshot { + _text; + _mtime; constructor(text, mtime) { this._text = text; this._mtime = mtime; @@ -317,6 +319,7 @@ class ScriptSnapshot { } } class VinylScriptSnapshot extends ScriptSnapshot { + _base; constructor(file) { super(file.contents.toString(), file.stat.mtime); this._base = file.base; @@ -326,15 +329,20 @@ class VinylScriptSnapshot extends ScriptSnapshot { } } class LanguageServiceHost { + _cmdLine; + _projectPath; + _log; + _snapshots; + _filesInProject; + _filesAdded; + _dependencies; + _dependenciesRecomputeList; + _fileNameToDeclaredModule; + _projectVersion; constructor(_cmdLine, _projectPath, _log) { this._cmdLine = _cmdLine; this._projectPath = _projectPath; this._log = _log; - this.directoryExists = ts.sys.directoryExists; - this.getDirectories = ts.sys.getDirectories; - this.fileExists = ts.sys.fileExists; - this.readFile = ts.sys.readFile; - this.readDirectory = ts.sys.readDirectory; this._snapshots = Object.create(null); this._filesInProject = new Set(_cmdLine.fileNames); this._filesAdded = new Set(); @@ -389,6 +397,7 @@ class LanguageServiceHost { } return result; } + static _declareModule = /declare\s+module\s+('|")(.+)\1/g; addScriptSnapshot(filename, snapshot) { this._projectVersion++; filename = normalize(filename); @@ -432,6 +441,11 @@ class LanguageServiceHost { getDefaultLibFileName(options) { return ts.getDefaultLibFilePath(options); } + directoryExists = ts.sys.directoryExists; + getDirectories = ts.sys.getDirectories; + fileExists = ts.sys.fileExists; + readFile = ts.sys.readFile; + readDirectory = ts.sys.readDirectory; // ---- dependency management collectDependents(filename, target) { while (this._dependenciesRecomputeList.length) { @@ -488,4 +502,3 @@ class LanguageServiceHost { }); } } -LanguageServiceHost._declareModule = /declare\s+module\s+('|")(.+)\1/g; diff --git a/build/lib/tsb/transpiler.js b/build/lib/tsb/transpiler.js index e5e90128d09..9086642128a 100644 --- a/build/lib/tsb/transpiler.js +++ b/build/lib/tsb/transpiler.js @@ -3,7 +3,6 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.SwcTranspiler = exports.TscTranspiler = void 0; const swc = require("@swc/core"); @@ -39,6 +38,7 @@ if (!threads.isMainThread) { }); } class OutputFileNameOracle { + getOutputFileName; constructor(cmdLine, configFilePath) { this.getOutputFileName = (file) => { try { @@ -68,10 +68,12 @@ class OutputFileNameOracle { } } class TranspileWorker { + static pool = 1; + id = TranspileWorker.pool++; + _worker = new threads.Worker(__filename); + _pending; + _durations = []; constructor(outFileFn) { - this.id = TranspileWorker.pool++; - this._worker = new threads.Worker(__filename); - this._durations = []; this._worker.addListener('message', (res) => { if (!this._pending) { console.error('RECEIVING data WITHOUT request'); @@ -142,14 +144,18 @@ class TranspileWorker { }); } } -TranspileWorker.pool = 1; class TscTranspiler { + _onError; + _cmdLine; + static P = Math.floor((0, node_os_1.cpus)().length * .5); + _outputFileNames; + onOutfile; + _workerPool = []; + _queue = []; + _allJobs = []; constructor(logFn, _onError, configFilePath, _cmdLine) { this._onError = _onError; this._cmdLine = _cmdLine; - this._workerPool = []; - this._queue = []; - this._allJobs = []; logFn('Transpile', `will use ${TscTranspiler.P} transpile worker`); this._outputFileNames = new OutputFileNameOracle(_cmdLine, configFilePath); } @@ -218,7 +224,6 @@ class TscTranspiler { } } exports.TscTranspiler = TscTranspiler; -TscTranspiler.P = Math.floor((0, node_os_1.cpus)().length * .5); function _isDefaultEmpty(src) { return src .replace('"use strict";', '') @@ -226,11 +231,16 @@ function _isDefaultEmpty(src) { .trim().length === 0; } class SwcTranspiler { + _logFn; + _onError; + _cmdLine; + onOutfile; + _outputFileNames; + _jobs = []; constructor(_logFn, _onError, configFilePath, _cmdLine) { this._logFn = _logFn; this._onError = _onError; this._cmdLine = _cmdLine; - this._jobs = []; _logFn('Transpile', `will use SWC to transpile source files`); this._outputFileNames = new OutputFileNameOracle(_cmdLine, configFilePath); } @@ -274,41 +284,40 @@ class SwcTranspiler { this._onError(err); })); } + // --- .swcrc + static _swcrcAmd = { + exclude: '\.js$', + jsc: { + parser: { + syntax: 'typescript', + tsx: false, + decorators: true + }, + target: 'es2020', + loose: false, + minify: { + compress: false, + mangle: false + } + }, + module: { + type: 'amd', + noInterop: true + }, + minify: false, + }; + static _swcrcCommonJS = { + ...this._swcrcAmd, + module: { + type: 'commonjs', + importInterop: 'none' + } + }; + static _swcrcEsm = { + ...this._swcrcAmd, + module: { + type: 'es6' + } + }; } exports.SwcTranspiler = SwcTranspiler; -_a = SwcTranspiler; -// --- .swcrc -SwcTranspiler._swcrcAmd = { - exclude: '\.js$', - jsc: { - parser: { - syntax: 'typescript', - tsx: false, - decorators: true - }, - target: 'es2020', - loose: false, - minify: { - compress: false, - mangle: false - } - }, - module: { - type: 'amd', - noInterop: true - }, - minify: false, -}; -SwcTranspiler._swcrcCommonJS = { - ..._a._swcrcAmd, - module: { - type: 'commonjs', - importInterop: 'none' - } -}; -SwcTranspiler._swcrcEsm = { - ..._a._swcrcAmd, - module: { - type: 'es6' - } -}; diff --git a/build/lib/tsb/utils.js b/build/lib/tsb/utils.js index cc8605758ce..10d8f37d196 100644 --- a/build/lib/tsb/utils.js +++ b/build/lib/tsb/utils.js @@ -71,9 +71,10 @@ var graph; } graph.newNode = newNode; class Graph { + _hashFn; + _nodes = {}; constructor(_hashFn) { this._hashFn = _hashFn; - this._nodes = {}; // empty } traverse(start, inwards, callback) { diff --git a/build/tsconfig.json b/build/tsconfig.json index ac3ce923add..8211139f396 100644 --- a/build/tsconfig.json +++ b/build/tsconfig.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "target": "es2020", + "target": "es2022", "lib": ["ES2020"], "module": "commonjs", "alwaysStrict": true, @@ -8,7 +8,6 @@ "preserveConstEnums": true, "sourceMap": false, "resolveJsonModule": true, - "experimentalDecorators": true, // enable JavaScript type checking for the language service // use the tsconfig.build.json for compiling which disable JavaScript // type checking so that JavaScript file are not transpiled From 3d2bd905cd1841fe635c8aa89b0027d7310b97c2 Mon Sep 17 00:00:00 2001 From: Raymond Zhao <7199958+rzhao271@users.noreply.github.com> Date: Thu, 3 Nov 2022 12:35:06 -0700 Subject: [PATCH 093/185] Refactor settingsWidgets (#165412) * WIP Change Settings editor CSS to variables * Refactor settingsWidgets --- .../browser/media/settingsEditor2.css | 34 +++++++ .../browser/media/settingsWidgets.css | 20 ++++ .../preferences/browser/settingsWidgets.ts | 95 +------------------ 3 files changed, 56 insertions(+), 93 deletions(-) diff --git a/src/vs/workbench/contrib/preferences/browser/media/settingsEditor2.css b/src/vs/workbench/contrib/preferences/browser/media/settingsEditor2.css index fdfd3a1cf55..3321d07eebb 100644 --- a/src/vs/workbench/contrib/preferences/browser/media/settingsEditor2.css +++ b/src/vs/workbench/contrib/preferences/browser/media/settingsEditor2.css @@ -76,6 +76,7 @@ .settings-editor > .settings-header > .settings-header-controls .settings-tabs-widget .action-label { opacity: 0.9; border-radius: 0; + color: var(--vscode-foreground); } .settings-editor > .settings-header > .settings-header-controls .last-synced-label { @@ -93,6 +94,8 @@ .settings-editor > .settings-header > .settings-header-controls .settings-tabs-widget .action-label.checked { opacity: 1; + color: var(--vscode-settings-headerForeground); + border-bottom-color: var(--vscode-settings-headerForeground); } .settings-editor > .settings-header .settings-tabs-widget > .monaco-action-bar .action-item .action-label { @@ -333,6 +336,7 @@ .settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-modified-indicator { display: none; + border-color: var(--vscode-settings-modifiedItemIndicator); } .settings-editor > .settings-body .settings-tree-container .setting-item-contents.is-configured .setting-item-modified-indicator { @@ -456,21 +460,35 @@ margin: 0px; } +.settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-markdown a, +.settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-markdown a > code { + color: var(--vscode-textLink-foreground); +} + .settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-markdown a:focus { outline: 1px solid -webkit-focus-ring-color; outline-offset: -1px; text-decoration: underline; } +.settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-markdown a:hover, +.settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-markdown a:active, +.settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-markdown a:hover > code, +.settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-markdown a:active > code { + color: var(--vscode-textLink-activeForeground); +} + .settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-markdown a:hover { cursor: pointer; text-decoration: underline; } + .settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-markdown code { line-height: 15px; /** For some reason, this is needed, otherwise will take up 20px height */ font-family: var(--monaco-monospace-font); + color: var(--vscode-textPreformat-foreground); } .settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-markdown .monaco-tokenized-source { @@ -543,6 +561,22 @@ padding: 2px 6px; } +.monaco-select-box-dropdown-container > .select-box-details-pane > .select-box-description-markdown code { + color: var(--vscode-textPreformat-foreground); +} + +.monaco-select-box-dropdown-container > .select-box-details-pane > .select-box-description-markdown a, +.monaco-select-box-dropdown-container > .select-box-details-pane > .select-box-description-markdown a > code { + color: var(--vscode-textLink-foreground); +} + +.monaco-select-box-dropdown-container > .select-box-details-pane > .select-box-description-markdown a:hover, +.monaco-select-box-dropdown-container > .select-box-details-pane > .select-box-description-markdown a:active, +.monaco-select-box-dropdown-container > .select-box-details-pane > .select-box-description-markdown a:hover > code, +.monaco-select-box-dropdown-container > .select-box-details-pane > .select-box-description-markdown a:active > code { + color: var(--vscode-textLink-activeForeground); +} + .settings-editor > .settings-body .settings-tree-container .setting-item-new-extensions { display: flex; } diff --git a/src/vs/workbench/contrib/preferences/browser/media/settingsWidgets.css b/src/vs/workbench/contrib/preferences/browser/media/settingsWidgets.css index ac9b41bff4c..229cb190ef6 100644 --- a/src/vs/workbench/contrib/preferences/browser/media/settingsWidgets.css +++ b/src/vs/workbench/contrib/preferences/browser/media/settingsWidgets.css @@ -23,6 +23,11 @@ text-overflow: ellipsis; } +.settings-editor > .settings-body .settings-tree-container .setting-item-bool .setting-value-checkbox { + background-color: var(--vscode-settings-checkboxBackground) !important; + color: var(--vscode-settings-checkboxForeground) !important; + border-color: var(--vscode-settings-checkboxBorder) !important; +} .settings-editor > .settings-body .settings-tree-container .setting-item-bool .setting-list-object-input-key-checkbox { margin-left: 4px; height: 24px; @@ -92,10 +97,25 @@ .settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-row { display: flex; } +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-row:hover { + background-color: var(--vscode-list-hoverBackground); + color: var(--vscode-list-hoverForeground); +} +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-row.selected:focus { + background-color: var(--vscode-list-activeSelectionBackground); + color: var(--vscode-list-activeSelectionForeground); +} +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-row.selected:not(:focus) { + background-color: var(--vscode-list-inactiveSelectionBackground); + color: var(--vscode-list-inactiveSelectionForeground); +} .settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-row.draggable { cursor: pointer; user-select: none; } +.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-row.drag-hover { + background-color: var(--vscode-list-dropBackground); +} .settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-row.drag-hover * { pointer-events: none; } diff --git a/src/vs/workbench/contrib/preferences/browser/settingsWidgets.ts b/src/vs/workbench/contrib/preferences/browser/settingsWidgets.ts index 88a3310bf7f..48c4089c26f 100644 --- a/src/vs/workbench/contrib/preferences/browser/settingsWidgets.ts +++ b/src/vs/workbench/contrib/preferences/browser/settingsWidgets.ts @@ -22,104 +22,13 @@ import { isDefined, isUndefinedOrNull } from 'vs/base/common/types'; import 'vs/css!./media/settingsWidgets'; import { localize } from 'vs/nls'; import { IContextViewService } from 'vs/platform/contextview/browser/contextView'; -import { foreground, listActiveSelectionBackground, listActiveSelectionForeground, listDropBackground, listHoverBackground, listHoverForeground, listInactiveSelectionBackground, listInactiveSelectionForeground, textLinkActiveForeground, textLinkForeground, textPreformatForeground } from 'vs/platform/theme/common/colorRegistry'; import { attachButtonStyler, attachInputBoxStyler, attachSelectBoxStyler } from 'vs/platform/theme/common/styler'; -import { IColorTheme, ICssStyleCollector, IThemeService, registerThemingParticipant, ThemeIcon } from 'vs/platform/theme/common/themeService'; +import { IThemeService, ThemeIcon } from 'vs/platform/theme/common/themeService'; import { settingsDiscardIcon, settingsEditIcon, settingsRemoveIcon } from 'vs/workbench/contrib/preferences/browser/preferencesIcons'; -import { modifiedItemIndicator, settingsCheckboxBackground, settingsCheckboxBorder, settingsCheckboxForeground, settingsHeaderForeground, settingsSelectBackground, settingsSelectBorder, settingsSelectForeground, settingsSelectListBorder, settingsTextInputBackground, settingsTextInputBorder, settingsTextInputForeground } from 'vs/workbench/contrib/preferences/common/settingsEditorColorRegistry'; +import { settingsSelectBackground, settingsSelectBorder, settingsSelectForeground, settingsSelectListBorder, settingsTextInputBackground, settingsTextInputBorder, settingsTextInputForeground } from 'vs/workbench/contrib/preferences/common/settingsEditorColorRegistry'; const $ = DOM.$; -registerThemingParticipant((theme: IColorTheme, collector: ICssStyleCollector) => { - const checkboxBackgroundColor = theme.getColor(settingsCheckboxBackground); - if (checkboxBackgroundColor) { - collector.addRule(`.settings-editor > .settings-body .settings-tree-container .setting-item-bool .setting-value-checkbox { background-color: ${checkboxBackgroundColor} !important; }`); - } - - const checkboxForegroundColor = theme.getColor(settingsCheckboxForeground); - if (checkboxForegroundColor) { - collector.addRule(`.settings-editor > .settings-body .settings-tree-container .setting-item-bool .setting-value-checkbox { color: ${checkboxForegroundColor} !important; }`); - } - - const checkboxBorderColor = theme.getColor(settingsCheckboxBorder); - if (checkboxBorderColor) { - collector.addRule(`.settings-editor > .settings-body .settings-tree-container .setting-item-bool .setting-value-checkbox { border-color: ${checkboxBorderColor} !important; }`); - } - - const link = theme.getColor(textLinkForeground); - if (link) { - collector.addRule(`.settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-markdown a { color: ${link}; }`); - collector.addRule(`.settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-markdown a > code { color: ${link}; }`); - collector.addRule(`.monaco-select-box-dropdown-container > .select-box-details-pane > .select-box-description-markdown a { color: ${link}; }`); - collector.addRule(`.monaco-select-box-dropdown-container > .select-box-details-pane > .select-box-description-markdown a > code { color: ${link}; }`); - } - - const activeLink = theme.getColor(textLinkActiveForeground); - if (activeLink) { - collector.addRule(`.settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-markdown a:hover, .settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-markdown a:active { color: ${activeLink}; }`); - collector.addRule(`.settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-markdown a:hover > code, .settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-markdown a:active > code { color: ${activeLink}; }`); - collector.addRule(`.monaco-select-box-dropdown-container > .select-box-details-pane > .select-box-description-markdown a:hover, .monaco-select-box-dropdown-container > .select-box-details-pane > .select-box-description-markdown a:active { color: ${activeLink}; }`); - collector.addRule(`.monaco-select-box-dropdown-container > .select-box-details-pane > .select-box-description-markdown a:hover > code, .monaco-select-box-dropdown-container > .select-box-details-pane > .select-box-description-markdown a:active > code { color: ${activeLink}; }`); - } - - const headerForegroundColor = theme.getColor(settingsHeaderForeground); - if (headerForegroundColor) { - collector.addRule(`.settings-editor > .settings-header > .settings-header-controls .settings-tabs-widget .action-label.checked { color: ${headerForegroundColor}; border-bottom-color: ${headerForegroundColor}; }`); - } - - const foregroundColor = theme.getColor(foreground); - if (foregroundColor) { - collector.addRule(`.settings-editor > .settings-header > .settings-header-controls .settings-tabs-widget .action-label { color: ${foregroundColor}; }`); - } - - // List control - const listHoverBackgroundColor = theme.getColor(listHoverBackground); - if (listHoverBackgroundColor) { - collector.addRule(`.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-row:hover { background-color: ${listHoverBackgroundColor}; }`); - } - - const listHoverForegroundColor = theme.getColor(listHoverForeground); - if (listHoverForegroundColor) { - collector.addRule(`.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-row:hover { color: ${listHoverForegroundColor}; }`); - } - - const listDropBackgroundColor = theme.getColor(listDropBackground); - if (listDropBackgroundColor) { - collector.addRule(`.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-row.drag-hover { background-color: ${listDropBackgroundColor}; }`); - } - - const listSelectBackgroundColor = theme.getColor(listActiveSelectionBackground); - if (listSelectBackgroundColor) { - collector.addRule(`.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-row.selected:focus { background-color: ${listSelectBackgroundColor}; }`); - } - - const listInactiveSelectionBackgroundColor = theme.getColor(listInactiveSelectionBackground); - if (listInactiveSelectionBackgroundColor) { - collector.addRule(`.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-row.selected:not(:focus) { background-color: ${listInactiveSelectionBackgroundColor}; }`); - } - - const listInactiveSelectionForegroundColor = theme.getColor(listInactiveSelectionForeground); - if (listInactiveSelectionForegroundColor) { - collector.addRule(`.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-row.selected:not(:focus) { color: ${listInactiveSelectionForegroundColor}; }`); - } - - const listSelectForegroundColor = theme.getColor(listActiveSelectionForeground); - if (listSelectForegroundColor) { - collector.addRule(`.settings-editor > .settings-body .settings-tree-container .setting-item.setting-item-list .setting-list-row.selected:focus { color: ${listSelectForegroundColor}; }`); - } - - const codeTextForegroundColor = theme.getColor(textPreformatForeground); - if (codeTextForegroundColor) { - collector.addRule(`.settings-editor > .settings-body .settings-tree-container .setting-item .setting-item-markdown code { color: ${codeTextForegroundColor} }`); - collector.addRule(`.monaco-select-box-dropdown-container > .select-box-details-pane > .select-box-description-markdown code { color: ${codeTextForegroundColor} }`); - } - - const modifiedItemIndicatorColor = theme.getColor(modifiedItemIndicator); - if (modifiedItemIndicatorColor) { - collector.addRule(`.settings-editor > .settings-body .settings-tree-container .setting-item-contents > .setting-item-modified-indicator { border-color: ${modifiedItemIndicatorColor}; }`); - } -}); - type EditKey = 'none' | 'create' | number; type RowElementGroup = { From eeb5ea617ad7b803953fa37fe90b53b388490981 Mon Sep 17 00:00:00 2001 From: Megan Rogge Date: Thu, 3 Nov 2022 15:46:34 -0400 Subject: [PATCH 094/185] remove unused exports (#165411) task part of #164933 --- src/vs/workbench/api/common/extHostTask.ts | 25 +++++++--------------- 1 file changed, 8 insertions(+), 17 deletions(-) diff --git a/src/vs/workbench/api/common/extHostTask.ts b/src/vs/workbench/api/common/extHostTask.ts index 033b98d338f..6fc4ada5e09 100644 --- a/src/vs/workbench/api/common/extHostTask.ts +++ b/src/vs/workbench/api/common/extHostTask.ts @@ -44,7 +44,7 @@ export interface IExtHostTask extends ExtHostTaskShape { terminateTask(execution: vscode.TaskExecution): Promise; } -export namespace TaskDefinitionDTO { +namespace TaskDefinitionDTO { export function from(value: vscode.TaskDefinition): tasks.ITaskDefinitionDTO | undefined { if (value === undefined || value === null) { return undefined; @@ -59,7 +59,7 @@ export namespace TaskDefinitionDTO { } } -export namespace TaskPresentationOptionsDTO { +namespace TaskPresentationOptionsDTO { export function from(value: vscode.TaskPresentationOptions): tasks.ITaskPresentationOptionsDTO | undefined { if (value === undefined || value === null) { return undefined; @@ -74,7 +74,7 @@ export namespace TaskPresentationOptionsDTO { } } -export namespace ProcessExecutionOptionsDTO { +namespace ProcessExecutionOptionsDTO { export function from(value: vscode.ProcessExecutionOptions): tasks.IProcessExecutionOptionsDTO | undefined { if (value === undefined || value === null) { return undefined; @@ -89,7 +89,7 @@ export namespace ProcessExecutionOptionsDTO { } } -export namespace ProcessExecutionDTO { +namespace ProcessExecutionDTO { export function is(value: tasks.IShellExecutionDTO | tasks.IProcessExecutionDTO | tasks.ICustomExecutionDTO | undefined): value is tasks.IProcessExecutionDTO { if (value) { const candidate = value as tasks.IProcessExecutionDTO; @@ -119,7 +119,7 @@ export namespace ProcessExecutionDTO { } } -export namespace ShellExecutionOptionsDTO { +namespace ShellExecutionOptionsDTO { export function from(value: vscode.ShellExecutionOptions): tasks.IShellExecutionOptionsDTO | undefined { if (value === undefined || value === null) { return undefined; @@ -134,7 +134,7 @@ export namespace ShellExecutionOptionsDTO { } } -export namespace ShellExecutionDTO { +namespace ShellExecutionDTO { export function is(value: tasks.IShellExecutionDTO | tasks.IProcessExecutionDTO | tasks.ICustomExecutionDTO | undefined): value is tasks.IShellExecutionDTO { if (value) { const candidate = value as tasks.IShellExecutionDTO; @@ -212,7 +212,7 @@ export namespace TaskHandleDTO { }; } } -export namespace TaskGroupDTO { +namespace TaskGroupDTO { export function from(value: vscode.TaskGroup): tasks.ITaskGroupDTO | undefined { if (value === undefined || value === null) { return undefined; @@ -338,7 +338,7 @@ export namespace TaskDTO { } } -export namespace TaskFilterDTO { +namespace TaskFilterDTO { export function from(value: vscode.TaskFilter | undefined): tasks.ITaskFilterDTO | undefined { return value; } @@ -374,15 +374,6 @@ class TaskExecutionImpl implements vscode.TaskExecution { } } -export namespace TaskExecutionDTO { - export function from(value: vscode.TaskExecution): tasks.ITaskExecutionDTO { - return { - id: (value as TaskExecutionImpl)._id, - task: undefined - }; - } -} - export interface HandlerData { type: string; provider: vscode.TaskProvider; From 6199d0e9dfc97b7c0e378516462a07be6c6e4d71 Mon Sep 17 00:00:00 2001 From: Joyce Er Date: Thu, 3 Nov 2022 13:34:43 -0700 Subject: [PATCH 095/185] Improve file dialog action button (#165417) * Improve file dialog action button * `Location` -> `Destination` --- extensions/git/src/commands.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/git/src/commands.ts b/extensions/git/src/commands.ts index 6cce8d881fe..076691d1a7c 100644 --- a/extensions/git/src/commands.ts +++ b/extensions/git/src/commands.ts @@ -543,7 +543,7 @@ export class CommandCenter { canSelectMany: false, defaultUri: Uri.file(defaultCloneDirectory), title: l10n.t('Choose a folder to clone {0} into', url), - openLabel: l10n.t('Select Repository Location') + openLabel: l10n.t('Select as Repository Destination') }); if (!uris || uris.length === 0) { From 92c40e4bdac5e6c3130db06efe293322ffa70a23 Mon Sep 17 00:00:00 2001 From: Megan Rogge Date: Thu, 3 Nov 2022 13:42:29 -0700 Subject: [PATCH 096/185] adopt CSS variables in terminal (#165419) --- .../terminal/browser/media/terminal.css | 82 ++++++++++++++++++- .../terminal/browser/terminalEditor.ts | 11 +-- .../terminal/browser/terminalInstance.ts | 55 +------------ .../contrib/terminal/browser/terminalView.ts | 34 +------- .../terminal/browser/xterm/decorationAddon.ts | 19 +---- .../browser/xterm/markNavigationAddon.ts | 11 +-- .../terminal/browser/xterm/quickFixAddon.ts | 19 ----- 7 files changed, 86 insertions(+), 145 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/browser/media/terminal.css b/src/vs/workbench/contrib/terminal/browser/media/terminal.css index 237a81753bf..395aa6c2348 100644 --- a/src/vs/workbench/contrib/terminal/browser/media/terminal.css +++ b/src/vs/workbench/contrib/terminal/browser/media/terminal.css @@ -17,7 +17,9 @@ .terminal-command-decoration.hide { visibility: hidden; } - +.monaco-workbench .part.panel .pane-body.integrated-terminal .terminal-outer-container { + background-color: var(--vscode-terminal-background, --vscode-panel-background); +} .monaco-workbench .pane-body.integrated-terminal .terminal-outer-container, .monaco-workbench .pane-body.integrated-terminal .terminal-groups-container, .monaco-workbench .pane-body.integrated-terminal .terminal-group, @@ -26,7 +28,23 @@ .monaco-workbench .editor-instance .terminal-outer-container { height: 100%; } +.monaco-workbench .part.sidebar .pane-body.integrated-terminal .terminal-outer-container, +.monaco-workbench .part.auxiliarybar .pane-body.integrated-terminal .terminal-outer-container { + background-color: var(--vscode-terminal-background, --vscode-sideBar-background); +} +.monaco-workbench .pane-body.integrated-terminal .split-view-view:not(:first-child), +.monaco-workbench .pane-body.integrated-terminal .tabs-container { + border-color: var(--vscode-terminal-border); +} + +.monaco-workbench .pane-body.integrated-terminal .terminal-drop-overlay { + background-color: var(--vscode-terminal-dropBackground, --vscode-editorGroup-dropBackground); +} + +.monaco-workbench .pane-body.integrated-terminal .terminal-tabs-entry.is-active::before { + background-color: var(--vscode-terminal-tab-activeBorder); +} /* Override monaco's styles for terminal editors */ .monaco-workbench .editor-instance .xterm textarea:focus { opacity: 0 !important; @@ -37,10 +55,14 @@ font-family: 'codicon' !important; font-size: 16px !important; } + .monaco-workbench .terminal-tab:not(.terminal-uri-icon)::before { background-image: none !important; } +.monaco-workbench .editor-instance .terminal-wrapper { + background-color: var(--vscode-terminal-background, --vscode-editorPane-background); +} .monaco-workbench .editor-instance .terminal-wrapper, .monaco-workbench .pane-body.integrated-terminal .terminal-wrapper { display: block; @@ -431,10 +453,21 @@ .terminal-command-decoration:not(.default):hover { cursor: pointer; border-radius: 5px; + background-color: var(--vscode-toolbar-hoverBackground); +} +.terminal-command-decoration { + color: var(--vscode-terminalCommandDecoration-successBackground); +} +.terminal-command-decoration.error { + color: var(--vscode-terminalCommandDecoration-errorBackground); } - .terminal-command-decoration.default { pointer-events: none; + color: var(--vscode-terminalCommandDecoration-defaultBackground); +} +.terminal-command-decoration.quick-fix { + color: var(--vscode-editorLightbulb-foreground); + background-color: var(--vscode-terminal-background, --vscode-panel-background); } .terminal-scroll-highlight { @@ -448,6 +481,9 @@ border: 1px solid #ffffff; } +.terminal-scroll-highlight { + border-color: var(--vscode-focusBorder); +} .hc-black .xterm-find-result-decoration, .hc-light .xterm-find-result-decoration { outline-style: dotted !important; @@ -464,3 +500,45 @@ /* Ensure the active decoration is above the regular decoration */ z-index: 7 !important; } + +.monaco-workbench.hc-black .editor-instance .xterm.focus::before, +.monaco-workbench.hc-black .pane-body.integrated-terminal .xterm.focus::before, +.monaco-workbench.hc-black .editor-instance .xterm:focus::before, +.monaco-workbench.hc-black .pane-body.integrated-terminal .xterm:focus::before, +.monaco-workbench.hc-light .editor-instance .xterm.focus::before, +.monaco-workbench.hc-light .pane-body.integrated-terminal .xterm.focus::before, +.monaco-workbench.hc-light .editor-instance .xterm:focus::before, +.monaco-workbench.hc-light .pane-body.integrated-terminal .xterm:focus::before { + border-color: var(--vscode-contrastActiveBorder); +} + +.monaco-workbench .editor-instance .find-focused .xterm .xterm-viewport, +.monaco-workbench .pane-body.integrated-terminal .find-focused .xterm .xterm-viewport, +.monaco-workbench .editor-instance .xterm.focus .xterm-viewport, +.monaco-workbench .pane-body.integrated-terminal .xterm.focus .xterm-viewport, +.monaco-workbench .editor-instance .xterm:focus .xterm-viewport, +.monaco-workbench .pane-body.integrated-terminal .xterm:focus .xterm-viewport, +.monaco-workbench .editor-instance .xterm:hover .xterm-viewport, +.monaco-workbench .pane-body.integrated-terminal .xterm:hover .xterm-viewport { + background-color: var(--vscode-scrollbarSlider-background) !important; +} + +.monaco-workbench .editor-instance .xterm-viewport, +.monaco-workbench .pane-body.integrated-terminal .xterm-viewport { + scrollbar-color: var(--vscode-scrollbarSlider-background) transparent; +} + +.monaco-workbench .editor-instance .xterm .xterm-viewport::-webkit-scrollbar-thumb:hover, +.monaco-workbench .pane-body.integrated-terminal .xterm .xterm-viewport::-webkit-scrollbar-thumb:hover { + background-color: var(--vscode-scrollbarSlider-hoverBackground); +} + +.monaco-workbench .editor-instance .xterm-viewport:hover, +.monaco-workbench .pane-body.integrated-terminal .xterm-viewport:hover { + scrollbar-color: var(--vscode-scrollbarSlider-hoverBackground) transparent; +} + +.monaco-workbench .editor-instance .xterm .xterm-viewport::-webkit-scrollbar-thumb:active, +.monaco-workbench .pane-body.integrated-terminal .xterm .xterm-viewport::-webkit-scrollbar-thumb:active { + background-color: var(--vscode-scrollbarSlider-activeBackground); +} diff --git a/src/vs/workbench/contrib/terminal/browser/terminalEditor.ts b/src/vs/workbench/contrib/terminal/browser/terminalEditor.ts index e429e11b712..b71eabb4d8b 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalEditor.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalEditor.ts @@ -15,7 +15,7 @@ import { IEditorOptions } from 'vs/platform/editor/common/editor'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IStorageService } from 'vs/platform/storage/common/storage'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { IColorTheme, ICssStyleCollector, IThemeService, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; +import { IThemeService } from 'vs/platform/theme/common/themeService'; import { EditorPane } from 'vs/workbench/browser/parts/editor/editorPane'; import { IEditorOpenContext } from 'vs/workbench/common/editor'; import { ITerminalEditorService, ITerminalService, terminalEditorId } from 'vs/workbench/contrib/terminal/browser/terminal'; @@ -29,8 +29,6 @@ import { INotificationService } from 'vs/platform/notification/common/notificati import { openContextMenu } from 'vs/workbench/contrib/terminal/browser/terminalContextMenu'; import { ACTIVE_GROUP } from 'vs/workbench/services/editor/common/editorService'; import { IWorkbenchLayoutService, Parts } from 'vs/workbench/services/layout/browser/layoutService'; -import { TERMINAL_BACKGROUND_COLOR } from 'vs/workbench/contrib/terminal/common/terminalColorRegistry'; -import { EDITOR_PANE_BACKGROUND } from 'vs/workbench/common/theme'; export class TerminalEditor extends EditorPane { @@ -222,10 +220,3 @@ export class TerminalEditor extends EditorPane { return defaultProfileName!; } } - -registerThemingParticipant((theme: IColorTheme, collector: ICssStyleCollector) => { - const backgroundColor = theme.getColor(TERMINAL_BACKGROUND_COLOR) || theme.getColor(EDITOR_PANE_BACKGROUND); - if (backgroundColor) { - collector.addRule(`.monaco-workbench .editor-instance .terminal-wrapper { background-color: ${backgroundColor.toString()}; }`); - } -}); diff --git a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts index b341deb63e7..3ef386a0319 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts @@ -50,9 +50,8 @@ import { TerminalCapabilityStoreMultiplexer } from 'vs/platform/terminal/common/ import { IProcessDataEvent, IProcessPropertyMap, IReconnectionProperties, IShellLaunchConfig, ITerminalDimensionsOverride, ITerminalLaunchError, PosixShellType, ProcessPropertyType, ShellIntegrationStatus, TerminalExitReason, TerminalIcon, TerminalLocation, TerminalSettingId, TerminalShellType, TitleEventSource, WindowsShellType } from 'vs/platform/terminal/common/terminal'; import { escapeNonWindowsPath } from 'vs/platform/terminal/common/terminalEnvironment'; import { formatMessageForTerminal } from 'vs/platform/terminal/common/terminalStrings'; -import { activeContrastBorder, scrollbarSliderActiveBackground, scrollbarSliderBackground, scrollbarSliderHoverBackground } from 'vs/platform/theme/common/colorRegistry'; import { getIconRegistry } from 'vs/platform/theme/common/iconRegistry'; -import { IColorTheme, ICssStyleCollector, IThemeService, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; +import { IThemeService } from 'vs/platform/theme/common/themeService'; import { IWorkspaceContextService, IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; import { IWorkspaceTrustRequestService } from 'vs/platform/workspace/common/workspaceTrust'; import { IViewDescriptorService, IViewsService, ViewContainerLocation } from 'vs/workbench/common/views'; @@ -2452,58 +2451,6 @@ class TerminalInstanceDragAndDropController extends Disposable implements dom.ID } } -registerThemingParticipant((theme: IColorTheme, collector: ICssStyleCollector) => { - // Border - const border = theme.getColor(activeContrastBorder); - if (border) { - collector.addRule(` - .monaco-workbench.hc-black .editor-instance .xterm.focus::before, - .monaco-workbench.hc-black .pane-body.integrated-terminal .xterm.focus::before, - .monaco-workbench.hc-black .editor-instance .xterm:focus::before, - .monaco-workbench.hc-black .pane-body.integrated-terminal .xterm:focus::before, - .monaco-workbench.hc-light .editor-instance .xterm.focus::before, - .monaco-workbench.hc-light .pane-body.integrated-terminal .xterm.focus::before, - .monaco-workbench.hc-light .editor-instance .xterm:focus::before, - .monaco-workbench.hc-light .pane-body.integrated-terminal .xterm:focus::before { border-color: ${border}; }` - ); - } - - // Scrollbar - const scrollbarSliderBackgroundColor = theme.getColor(scrollbarSliderBackground); - if (scrollbarSliderBackgroundColor) { - collector.addRule(` - .monaco-workbench .editor-instance .find-focused .xterm .xterm-viewport, - .monaco-workbench .pane-body.integrated-terminal .find-focused .xterm .xterm-viewport, - .monaco-workbench .editor-instance .xterm.focus .xterm-viewport, - .monaco-workbench .pane-body.integrated-terminal .xterm.focus .xterm-viewport, - .monaco-workbench .editor-instance .xterm:focus .xterm-viewport, - .monaco-workbench .pane-body.integrated-terminal .xterm:focus .xterm-viewport, - .monaco-workbench .editor-instance .xterm:hover .xterm-viewport, - .monaco-workbench .pane-body.integrated-terminal .xterm:hover .xterm-viewport { background-color: ${scrollbarSliderBackgroundColor} !important; } - .monaco-workbench .editor-instance .xterm-viewport, - .monaco-workbench .pane-body.integrated-terminal .xterm-viewport { scrollbar-color: ${scrollbarSliderBackgroundColor} transparent; } - `); - } - - const scrollbarSliderHoverBackgroundColor = theme.getColor(scrollbarSliderHoverBackground); - if (scrollbarSliderHoverBackgroundColor) { - collector.addRule(` - .monaco-workbench .editor-instance .xterm .xterm-viewport::-webkit-scrollbar-thumb:hover, - .monaco-workbench .pane-body.integrated-terminal .xterm .xterm-viewport::-webkit-scrollbar-thumb:hover { background-color: ${scrollbarSliderHoverBackgroundColor}; } - .monaco-workbench .editor-instance .xterm-viewport:hover, - .monaco-workbench .pane-body.integrated-terminal .xterm-viewport:hover { scrollbar-color: ${scrollbarSliderHoverBackgroundColor} transparent; } - `); - } - - const scrollbarSliderActiveBackgroundColor = theme.getColor(scrollbarSliderActiveBackground); - if (scrollbarSliderActiveBackgroundColor) { - collector.addRule(` - .monaco-workbench .editor-instance .xterm .xterm-viewport::-webkit-scrollbar-thumb:active, - .monaco-workbench .pane-body.integrated-terminal .xterm .xterm-viewport::-webkit-scrollbar-thumb:active { background-color: ${scrollbarSliderActiveBackgroundColor}; } - `); - } -}); - interface ITerminalLabelTemplateProperties { cwd?: string | null | undefined; cwdFolder?: string | null | undefined; diff --git a/src/vs/workbench/contrib/terminal/browser/terminalView.ts b/src/vs/workbench/contrib/terminal/browser/terminalView.ts index c4ca73abbbb..1a7f046e141 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalView.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalView.ts @@ -10,9 +10,8 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { IContextMenuService, IContextViewService } from 'vs/platform/contextview/browser/contextView'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { IThemeService, IColorTheme, registerThemingParticipant, ICssStyleCollector, ThemeIcon, Themable } from 'vs/platform/theme/common/themeService'; +import { IThemeService, ThemeIcon, Themable } from 'vs/platform/theme/common/themeService'; import { switchTerminalActionViewItemSeparator, switchTerminalShowTabsTitle } from 'vs/workbench/contrib/terminal/browser/terminalActions'; -import { TERMINAL_BACKGROUND_COLOR, TERMINAL_BORDER_COLOR, TERMINAL_DRAG_AND_DROP_BACKGROUND, TERMINAL_TAB_ACTIVE_BORDER } from 'vs/workbench/contrib/terminal/common/terminalColorRegistry'; import { INotificationService, IPromptChoice, Severity } from 'vs/platform/notification/common/notification'; import { ICreateTerminalOptions, ITerminalGroupService, ITerminalInstance, ITerminalService, TerminalConnectionState, TerminalDataTransfers } from 'vs/workbench/contrib/terminal/browser/terminal'; import { ViewPane, IViewPaneOptions } from 'vs/workbench/browser/parts/views/viewPane'; @@ -20,7 +19,6 @@ import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IViewDescriptorService } from 'vs/workbench/common/views'; import { IOpenerService } from 'vs/platform/opener/common/opener'; -import { PANEL_BACKGROUND, SIDE_BAR_BACKGROUND, EDITOR_DRAG_AND_DROP_BACKGROUND } from 'vs/workbench/common/theme'; import { IMenu, IMenuService, MenuId, MenuItemAction } from 'vs/platform/actions/common/actions'; import { ITerminalProfileResolverService, ITerminalProfileService, TerminalCommandId } from 'vs/workbench/contrib/terminal/common/terminal'; import { TerminalSettingId, ITerminalProfile, TerminalLocation } from 'vs/platform/terminal/common/terminal'; @@ -286,36 +284,6 @@ export class TerminalViewPane extends ViewPane { } } -registerThemingParticipant((theme: IColorTheme, collector: ICssStyleCollector) => { - const panelBackgroundColor = theme.getColor(TERMINAL_BACKGROUND_COLOR) || theme.getColor(PANEL_BACKGROUND); - if (panelBackgroundColor) { - collector.addRule(`.monaco-workbench .part.panel .pane-body.integrated-terminal .terminal-outer-container { background-color: ${panelBackgroundColor.toString()}; }`); - } - - const sidebarBackgroundColor = theme.getColor(TERMINAL_BACKGROUND_COLOR) || theme.getColor(SIDE_BAR_BACKGROUND); - if (sidebarBackgroundColor) { - collector.addRule(`.monaco-workbench .part.sidebar .pane-body.integrated-terminal .terminal-outer-container { background-color: ${sidebarBackgroundColor.toString()}; }`); - collector.addRule(`.monaco-workbench .part.auxiliarybar .pane-body.integrated-terminal .terminal-outer-container { background-color: ${sidebarBackgroundColor.toString()}; }`); - } - - const borderColor = theme.getColor(TERMINAL_BORDER_COLOR); - if (borderColor) { - collector.addRule(`.monaco-workbench .pane-body.integrated-terminal .split-view-view:not(:first-child) { border-color: ${borderColor.toString()}; }`); - collector.addRule(`.monaco-workbench .pane-body.integrated-terminal .tabs-container { border-color: ${borderColor.toString()}; }`); - } - - const dndBackgroundColor = theme.getColor(TERMINAL_DRAG_AND_DROP_BACKGROUND) || theme.getColor(EDITOR_DRAG_AND_DROP_BACKGROUND); - if (dndBackgroundColor) { - collector.addRule(`.monaco-workbench .pane-body.integrated-terminal .terminal-drop-overlay { background-color: ${dndBackgroundColor.toString()}; }`); - } - - const activeTabBorderColor = theme.getColor(TERMINAL_TAB_ACTIVE_BORDER); - if (activeTabBorderColor) { - collector.addRule(`.monaco-workbench .pane-body.integrated-terminal .terminal-tabs-entry.is-active::before { background-color: ${activeTabBorderColor.toString()}; }`); - } -}); - - class SwitchTerminalActionViewItem extends SelectActionViewItem { constructor( action: IAction, diff --git a/src/vs/workbench/contrib/terminal/browser/xterm/decorationAddon.ts b/src/vs/workbench/contrib/terminal/browser/xterm/decorationAddon.ts index 3cf8a961eab..677c9438052 100644 --- a/src/vs/workbench/contrib/terminal/browser/xterm/decorationAddon.ts +++ b/src/vs/workbench/contrib/terminal/browser/xterm/decorationAddon.ts @@ -17,8 +17,7 @@ import { IOpenerService } from 'vs/platform/opener/common/opener'; import { IQuickInputService, IQuickPickItem } from 'vs/platform/quickinput/common/quickInput'; import { CommandInvalidationReason, ICommandDetectionCapability, IMarkProperties, ITerminalCapabilityStore, TerminalCapability } from 'vs/platform/terminal/common/capabilities/capabilities'; import { TerminalSettingId } from 'vs/platform/terminal/common/terminal'; -import { toolbarHoverBackground } from 'vs/platform/theme/common/colorRegistry'; -import { IColorTheme, ICssStyleCollector, IThemeService, registerThemingParticipant, ThemeIcon } from 'vs/platform/theme/common/themeService'; +import { IColorTheme, IThemeService, registerThemingParticipant, ThemeIcon } from 'vs/platform/theme/common/themeService'; import { TaskSettingId } from 'vs/workbench/contrib/tasks/common/tasks'; import { terminalDecorationError, terminalDecorationIncomplete, terminalDecorationMark, terminalDecorationSuccess } from 'vs/workbench/contrib/terminal/browser/terminalIcons'; import { DecorationSelector, TerminalDecorationHoverManager, updateLayout } from 'vs/workbench/contrib/terminal/browser/xterm/decorationStyles'; @@ -460,22 +459,8 @@ export class DecorationAddon extends Disposable implements ITerminalAddon { let successColor: string | Color | undefined; let errorColor: string | Color | undefined; let defaultColor: string | Color | undefined; -registerThemingParticipant((theme: IColorTheme, collector: ICssStyleCollector) => { +registerThemingParticipant((theme: IColorTheme) => { successColor = theme.getColor(TERMINAL_COMMAND_DECORATION_SUCCESS_BACKGROUND_COLOR); errorColor = theme.getColor(TERMINAL_COMMAND_DECORATION_ERROR_BACKGROUND_COLOR); defaultColor = theme.getColor(TERMINAL_COMMAND_DECORATION_DEFAULT_BACKGROUND_COLOR); - const hoverBackgroundColor = theme.getColor(toolbarHoverBackground); - - if (successColor) { - collector.addRule(`.${DecorationSelector.CommandDecoration} { color: ${successColor.toString()}; } `); - } - if (errorColor) { - collector.addRule(`.${DecorationSelector.CommandDecoration}.${DecorationSelector.ErrorColor} { color: ${errorColor.toString()}; } `); - } - if (defaultColor) { - collector.addRule(`.${DecorationSelector.CommandDecoration}.${DecorationSelector.DefaultColor} { color: ${defaultColor.toString()};} `); - } - if (hoverBackgroundColor) { - collector.addRule(`.${DecorationSelector.CommandDecoration}:not(.${DecorationSelector.DefaultColor}):hover { background-color: ${hoverBackgroundColor.toString()}; }`); - } }); diff --git a/src/vs/workbench/contrib/terminal/browser/xterm/markNavigationAddon.ts b/src/vs/workbench/contrib/terminal/browser/xterm/markNavigationAddon.ts index 1ce5a93bcc0..fa5547da786 100644 --- a/src/vs/workbench/contrib/terminal/browser/xterm/markNavigationAddon.ts +++ b/src/vs/workbench/contrib/terminal/browser/xterm/markNavigationAddon.ts @@ -9,8 +9,7 @@ import { IMarkTracker } from 'vs/workbench/contrib/terminal/browser/terminal'; import { ITerminalCapabilityStore, TerminalCapability } from 'vs/platform/terminal/common/capabilities/capabilities'; import type { Terminal, IMarker, ITerminalAddon, IDecoration } from 'xterm'; import { timeout } from 'vs/base/common/async'; -import { IColorTheme, ICssStyleCollector, IThemeService, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; -import { focusBorder } from 'vs/platform/theme/common/colorRegistry'; +import { IThemeService } from 'vs/platform/theme/common/themeService'; import { TERMINAL_OVERVIEW_RULER_CURSOR_FOREGROUND_COLOR } from 'vs/workbench/contrib/terminal/common/terminalColorRegistry'; enum Boundary { @@ -437,14 +436,6 @@ export class MarkNavigationAddon extends Disposable implements IMarkTracker, ITe } } -registerThemingParticipant((theme: IColorTheme, collector: ICssStyleCollector) => { - const focusBorderColor = theme.getColor(focusBorder); - - if (focusBorderColor) { - collector.addRule(`.terminal-scroll-highlight { border-color: ${focusBorderColor.toString()}; } `); - } -}); - export function getLine(xterm: Terminal, marker: IMarker | Boundary): number { // Use the _second last_ row as the last row is likely the prompt if (marker === Boundary.Bottom) { diff --git a/src/vs/workbench/contrib/terminal/browser/xterm/quickFixAddon.ts b/src/vs/workbench/contrib/terminal/browser/xterm/quickFixAddon.ts index 9f056ddd982..65045e25bd0 100644 --- a/src/vs/workbench/contrib/terminal/browser/xterm/quickFixAddon.ts +++ b/src/vs/workbench/contrib/terminal/browser/xterm/quickFixAddon.ts @@ -8,18 +8,14 @@ import { ITerminalCapabilityStore, ITerminalCommand, TerminalCapability } from ' import * as dom from 'vs/base/browser/dom'; import { IAction } from 'vs/base/common/actions'; import { asArray } from 'vs/base/common/arrays'; -import { Color } from 'vs/base/common/color'; import { localize } from 'vs/nls'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { IOpenerService } from 'vs/platform/opener/common/opener'; -import { IColorTheme, ICssStyleCollector, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; -import { PANEL_BACKGROUND } from 'vs/workbench/common/theme'; import { AudioCue, IAudioCueService } from 'vs/workbench/contrib/audioCues/browser/audioCueService'; import { ITerminalQuickFixOpenerAction, ITerminalQuickFixOptions, TerminalQuickFixAction, TerminalQuickFixMatchResult } from 'vs/workbench/contrib/terminal/browser/terminal'; import { DecorationSelector, TerminalDecorationHoverManager, updateLayout } from 'vs/workbench/contrib/terminal/browser/xterm/decorationStyles'; import { TerminalCommandId } from 'vs/workbench/contrib/terminal/common/terminal'; -import { TERMINAL_BACKGROUND_COLOR } from 'vs/workbench/contrib/terminal/common/terminalColorRegistry'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IDecoration, Terminal } from 'xterm'; @@ -332,21 +328,6 @@ export function getQuickFixesForCommand( return fixes.length > 0 ? { fixes, onDidRunQuickFix, expectedCommands } : undefined; } - - -let foregroundColor: string | Color | undefined; -let backgroundColor: string | Color | undefined; -registerThemingParticipant((theme: IColorTheme, collector: ICssStyleCollector) => { - foregroundColor = theme.getColor('editorLightBulb.foreground'); - backgroundColor = theme.getColor(TERMINAL_BACKGROUND_COLOR) || theme.getColor(PANEL_BACKGROUND); - if (foregroundColor) { - collector.addRule(`.${DecorationSelector.CommandDecoration}.${DecorationSelector.QuickFix} { color: ${foregroundColor.toString()} !important; } `); - } - if (backgroundColor) { - collector.addRule(`.${DecorationSelector.CommandDecoration}.${DecorationSelector.QuickFix} { background-color: ${backgroundColor.toString()}; } `); - } -}); - export function convertToQuickFixOptions(quickFix: IExtensionTerminalQuickFix): ITerminalQuickFixOptions { const type = quickFix.commandToRun ? 'command' : quickFix.linkToOpen ? 'opener' : undefined; const options = { From 0a6c7281a16077c55373cecadd16aa9405d00feb Mon Sep 17 00:00:00 2001 From: David Dossett Date: Thu, 3 Nov 2022 14:12:09 -0700 Subject: [PATCH 097/185] Improve command center hover colors (#165427) Improve command center hover interaction --- .../parts/titlebar/commandCenterControl.ts | 16 ++++++++++++---- .../parts/titlebar/media/titlebarpart.css | 1 + 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/browser/parts/titlebar/commandCenterControl.ts b/src/vs/workbench/browser/parts/titlebar/commandCenterControl.ts index 9e931773398..0069c440c84 100644 --- a/src/vs/workbench/browser/parts/titlebar/commandCenterControl.ts +++ b/src/vs/workbench/browser/parts/titlebar/commandCenterControl.ts @@ -10,6 +10,7 @@ import { setupCustomHover } from 'vs/base/browser/ui/iconLabel/iconLabelHover'; import { renderIcon } from 'vs/base/browser/ui/iconLabel/iconLabels'; import { IAction } from 'vs/base/common/actions'; import { Codicon } from 'vs/base/common/codicons'; +import { Color } from 'vs/base/common/color'; import { Emitter, Event } from 'vs/base/common/event'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { localize } from 'vs/nls'; @@ -157,22 +158,29 @@ colors.registerColor( // background (inactive and active) colors.registerColor( 'commandCenter.background', - { dark: null, hcDark: null, light: null, hcLight: null }, + { + dark: Color.white.transparent(0.05), hcDark: null, light: Color.black.transparent(0.05), hcLight: null + }, localize('commandCenter-background', "Background color of the command center"), false ); colors.registerColor( 'commandCenter.activeBackground', - { dark: MENUBAR_SELECTION_BACKGROUND, hcDark: MENUBAR_SELECTION_BACKGROUND, light: MENUBAR_SELECTION_BACKGROUND, hcLight: MENUBAR_SELECTION_BACKGROUND }, + { dark: Color.white.transparent(0.08), hcDark: MENUBAR_SELECTION_BACKGROUND, light: Color.black.transparent(0.08), hcLight: MENUBAR_SELECTION_BACKGROUND }, localize('commandCenter-activeBackground', "Active background color of the command center"), false ); -// border: defaults to active background +// border: active and inactive. defaults to active background colors.registerColor( - 'commandCenter.border', { dark: colors.transparent(TITLE_BAR_ACTIVE_FOREGROUND, .25), hcDark: colors.transparent(TITLE_BAR_ACTIVE_FOREGROUND, .25), light: colors.transparent(TITLE_BAR_ACTIVE_FOREGROUND, .25), hcLight: colors.transparent(TITLE_BAR_ACTIVE_FOREGROUND, .25) }, + 'commandCenter.border', { dark: colors.transparent(TITLE_BAR_ACTIVE_FOREGROUND, .20), hcDark: colors.transparent(TITLE_BAR_ACTIVE_FOREGROUND, .60), light: colors.transparent(TITLE_BAR_ACTIVE_FOREGROUND, .20), hcLight: colors.transparent(TITLE_BAR_ACTIVE_FOREGROUND, .60) }, localize('commandCenter-border', "Border color of the command center"), false ); +colors.registerColor( + 'commandCenter.activeBorder', { dark: colors.transparent(TITLE_BAR_ACTIVE_FOREGROUND, .30), hcDark: TITLE_BAR_ACTIVE_FOREGROUND, light: colors.transparent(TITLE_BAR_ACTIVE_FOREGROUND, .30), hcLight: TITLE_BAR_ACTIVE_FOREGROUND }, + localize('commandCenter-activeBorder', "Active border color of the command center"), + false +); // border: defaults to active background colors.registerColor( 'commandCenter.inactiveBorder', { dark: colors.transparent(TITLE_BAR_INACTIVE_FOREGROUND, .25), hcDark: colors.transparent(TITLE_BAR_INACTIVE_FOREGROUND, .25), light: colors.transparent(TITLE_BAR_INACTIVE_FOREGROUND, .25), hcLight: colors.transparent(TITLE_BAR_INACTIVE_FOREGROUND, .25) }, diff --git a/src/vs/workbench/browser/parts/titlebar/media/titlebarpart.css b/src/vs/workbench/browser/parts/titlebar/media/titlebarpart.css index 3dbdc5086a5..79351d937c2 100644 --- a/src/vs/workbench/browser/parts/titlebar/media/titlebarpart.css +++ b/src/vs/workbench/browser/parts/titlebar/media/titlebarpart.css @@ -148,6 +148,7 @@ .monaco-workbench .part.titlebar>.titlebar-container>.window-title>.command-center .action-item.command-center:HOVER { color: var(--vscode-commandCenter-activeForeground); background-color: var(--vscode-commandCenter-activeBackground); + border-color: var(--vscode-commandCenter-activeBorder); } /* Menubar */ From 2e47c97e6fe7e28a01fa4d6eed7d4aa33ca1f4e8 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Thu, 3 Nov 2022 22:21:05 +0100 Subject: [PATCH 098/185] keybindingLabel: switch theming to css variables (#165426) --- .../ui/keybindingLabel/keybindingLabel.ts | 80 +++++++------------ src/vs/editor/browser/editorDom.ts | 4 +- .../platform/theme/browser/defaultStyles.ts | 26 ++++++ src/vs/platform/theme/common/colorRegistry.ts | 4 + src/vs/platform/theme/common/styler.ts | 21 +---- .../extensions/browser/extensionEditor.ts | 5 +- .../preferences/browser/keybindingWidgets.ts | 14 +--- .../preferences/browser/keybindingsEditor.ts | 14 ++-- .../contrib/watermark/browser/watermark.ts | 9 +-- .../decorations/browser/decorationsService.ts | 6 +- 10 files changed, 81 insertions(+), 102 deletions(-) create mode 100644 src/vs/platform/theme/browser/defaultStyles.ts diff --git a/src/vs/base/browser/ui/keybindingLabel/keybindingLabel.ts b/src/vs/base/browser/ui/keybindingLabel/keybindingLabel.ts index 6a970112b27..57d90964cea 100644 --- a/src/vs/base/browser/ui/keybindingLabel/keybindingLabel.ts +++ b/src/vs/base/browser/ui/keybindingLabel/keybindingLabel.ts @@ -4,12 +4,10 @@ *--------------------------------------------------------------------------------------------*/ import * as dom from 'vs/base/browser/dom'; -import { Color } from 'vs/base/common/color'; import { UILabelProvider } from 'vs/base/common/keybindingLabels'; import { ResolvedKeybinding, ResolvedKeybindingPart } from 'vs/base/common/keybindings'; import { equals } from 'vs/base/common/objects'; import { OperatingSystem } from 'vs/base/common/platform'; -import { IThemable } from 'vs/base/common/styler'; import 'vs/css!./keybindingLabel'; import { localize } from 'vs/nls'; @@ -32,15 +30,17 @@ export interface KeybindingLabelOptions extends IKeybindingLabelStyles { renderUnboundKeybindings?: boolean; } +export type CSSValueString = string; + export interface IKeybindingLabelStyles { - keybindingLabelBackground?: Color; - keybindingLabelForeground?: Color; - keybindingLabelBorder?: Color; - keybindingLabelBottomBorder?: Color; - keybindingLabelShadow?: Color; + keybindingLabelBackground?: CSSValueString; + keybindingLabelForeground?: CSSValueString; + keybindingLabelBorder?: CSSValueString; + keybindingLabelBottomBorder?: CSSValueString; + keybindingLabelShadow?: CSSValueString; } -export class KeybindingLabel implements IThemable { +export class KeybindingLabel { private domNode: HTMLElement; private options: KeybindingLabelOptions; @@ -51,22 +51,26 @@ export class KeybindingLabel implements IThemable { private matches: Matches | undefined; private didEverRender: boolean; - private labelBackground: Color | undefined; - private labelForeground: Color | undefined; - private labelBorder: Color | undefined; - private labelBottomBorder: Color | undefined; - private labelShadow: Color | undefined; + private labelBackground: CSSValueString | undefined; + private labelBorder: CSSValueString | undefined; + private labelBottomBorder: CSSValueString | undefined; + private labelShadow: CSSValueString | undefined; constructor(container: HTMLElement, private os: OperatingSystem, options?: KeybindingLabelOptions) { this.options = options || Object.create(null); this.labelBackground = this.options.keybindingLabelBackground; - this.labelForeground = this.options.keybindingLabelForeground; this.labelBorder = this.options.keybindingLabelBorder; this.labelBottomBorder = this.options.keybindingLabelBottomBorder; this.labelShadow = this.options.keybindingLabelShadow; + const labelForeground = this.options.keybindingLabelForeground; + this.domNode = dom.append(container, $('.monaco-keybinding')); + if (labelForeground) { + this.domNode.style.color = labelForeground; + } + this.didEverRender = false; container.appendChild(this.domNode); } @@ -102,8 +106,6 @@ export class KeybindingLabel implements IThemable { this.renderUnbound(this.domNode); } - this.applyStyles(); - this.didEverRender = true; } @@ -147,40 +149,20 @@ export class KeybindingLabel implements IThemable { const keyElement = $('span.monaco-keybinding-key' + extraClass, undefined, label); this.keyElements.add(keyElement); - return keyElement; - } - - style(styles: IKeybindingLabelStyles): void { - this.labelBackground = styles.keybindingLabelBackground; - this.labelForeground = styles.keybindingLabelForeground; - this.labelBorder = styles.keybindingLabelBorder; - this.labelBottomBorder = styles.keybindingLabelBottomBorder; - this.labelShadow = styles.keybindingLabelShadow; - - this.applyStyles(); - } - - private applyStyles() { - if (this.element) { - for (const keyElement of this.keyElements) { - if (this.labelBackground) { - keyElement.style.backgroundColor = this.labelBackground?.toString(); - } - if (this.labelBorder) { - keyElement.style.borderColor = this.labelBorder.toString(); - } - if (this.labelBottomBorder) { - keyElement.style.borderBottomColor = this.labelBottomBorder.toString(); - } - if (this.labelShadow) { - keyElement.style.boxShadow = `inset 0 -1px 0 ${this.labelShadow}`; - } - } - - if (this.labelForeground) { - this.element.style.color = this.labelForeground.toString(); - } + if (this.labelBackground) { + keyElement.style.backgroundColor = this.labelBackground; } + if (this.labelBorder) { + keyElement.style.borderColor = this.labelBorder; + } + if (this.labelBottomBorder) { + keyElement.style.borderBottomColor = this.labelBottomBorder; + } + if (this.labelShadow) { + keyElement.style.boxShadow = `inset 0 -1px 0 ${this.labelShadow}`; + } + + return keyElement; } private static areSame(a: Matches | undefined, b: Matches | undefined): boolean { diff --git a/src/vs/editor/browser/editorDom.ts b/src/vs/editor/browser/editorDom.ts index 4cfc92f8a6e..edea50a9f30 100644 --- a/src/vs/editor/browser/editorDom.ts +++ b/src/vs/editor/browser/editorDom.ts @@ -9,7 +9,7 @@ import { StandardMouseEvent } from 'vs/base/browser/mouseEvent'; import { RunOnceScheduler } from 'vs/base/common/async'; import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; -import { asCssVariableName } from 'vs/platform/theme/common/colorRegistry'; +import { asCssValue } from 'vs/platform/theme/common/colorRegistry'; import { ThemeColor } from 'vs/platform/theme/common/themeService'; /** @@ -378,7 +378,7 @@ class RefCountedCssRule { const value = (properties as any)[prop] as string | ThemeColor; let cssValue; if (typeof value === 'object') { - cssValue = `var(${asCssVariableName(value.id)})`; + cssValue = asCssValue(value.id); } else { cssValue = value; } diff --git a/src/vs/platform/theme/browser/defaultStyles.ts b/src/vs/platform/theme/browser/defaultStyles.ts new file mode 100644 index 00000000000..3b622a2829d --- /dev/null +++ b/src/vs/platform/theme/browser/defaultStyles.ts @@ -0,0 +1,26 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +import { IKeybindingLabelStyles } from 'vs/base/browser/ui/keybindingLabel/keybindingLabel'; +import { ColorIdentifier, keybindingLabelBackground, keybindingLabelBorder, keybindingLabelBottomBorder, keybindingLabelForeground, asCssValue, widgetShadow } from 'vs/platform/theme/common/colorRegistry'; +import { IStyleOverrides } from 'vs/platform/theme/common/styler'; + + +export interface IKeybindingLabelStyleOverrides extends IStyleOverrides { + keybindingLabelBackground?: ColorIdentifier; + keybindingLabelForeground?: ColorIdentifier; + keybindingLabelBorder?: ColorIdentifier; + keybindingLabelBottomBorder?: ColorIdentifier; + keybindingLabelShadow?: ColorIdentifier; +} + +export function getKeybindingLabelStyles(style?: IKeybindingLabelStyleOverrides): IKeybindingLabelStyles { + return { + keybindingLabelBackground: asCssValue(style?.keybindingLabelBackground || keybindingLabelBackground), + keybindingLabelForeground: asCssValue(style?.keybindingLabelForeground || keybindingLabelForeground), + keybindingLabelBorder: asCssValue(style?.keybindingLabelBorder || keybindingLabelBorder), + keybindingLabelBottomBorder: asCssValue(style?.keybindingLabelBottomBorder || keybindingLabelBottomBorder), + keybindingLabelShadow: asCssValue(style?.keybindingLabelShadow || widgetShadow) + }; +} diff --git a/src/vs/platform/theme/common/colorRegistry.ts b/src/vs/platform/theme/common/colorRegistry.ts index d4ba695131b..ff92332f808 100644 --- a/src/vs/platform/theme/common/colorRegistry.ts +++ b/src/vs/platform/theme/common/colorRegistry.ts @@ -35,6 +35,10 @@ export function asCssVariableName(colorIdent: ColorIdentifier): string { return `--vscode-${colorIdent.replace(/\./g, '-')}`; } +export function asCssValue(color: ColorIdentifier): string { + return `var(${asCssVariableName(color)})`; +} + export const enum ColorTransformType { Darken, Lighten, diff --git a/src/vs/platform/theme/common/styler.ts b/src/vs/platform/theme/common/styler.ts index ea7724499c9..f9b69b944ca 100644 --- a/src/vs/platform/theme/common/styler.ts +++ b/src/vs/platform/theme/common/styler.ts @@ -6,7 +6,7 @@ import { Color } from 'vs/base/common/color'; import { IDisposable } from 'vs/base/common/lifecycle'; import { IThemable, styleFn } from 'vs/base/common/styler'; -import { activeContrastBorder, badgeBackground, badgeForeground, breadcrumbsActiveSelectionForeground, breadcrumbsBackground, breadcrumbsFocusForeground, breadcrumbsForeground, buttonBackground, buttonBorder, buttonForeground, buttonHoverBackground, buttonSecondaryBackground, buttonSecondaryForeground, buttonSecondaryHoverBackground, ColorIdentifier, ColorTransform, ColorValue, contrastBorder, editorWidgetBackground, editorWidgetBorder, editorWidgetForeground, focusBorder, inputActiveOptionBackground, inputActiveOptionBorder, inputActiveOptionForeground, inputBackground, inputBorder, inputForeground, inputValidationErrorBackground, inputValidationErrorBorder, inputValidationErrorForeground, inputValidationInfoBackground, inputValidationInfoBorder, inputValidationInfoForeground, inputValidationWarningBackground, inputValidationWarningBorder, inputValidationWarningForeground, keybindingLabelBackground, keybindingLabelBorder, keybindingLabelBottomBorder, keybindingLabelForeground, listActiveSelectionBackground, listActiveSelectionForeground, listActiveSelectionIconForeground, listDropBackground, listFilterWidgetBackground, listFilterWidgetNoMatchesOutline, listFilterWidgetOutline, listFocusBackground, listFocusForeground, listFocusOutline, listHoverBackground, listHoverForeground, listInactiveFocusBackground, listInactiveFocusOutline, listInactiveSelectionBackground, listInactiveSelectionForeground, listInactiveSelectionIconForeground, menuBackground, menuBorder, menuForeground, menuSelectionBackground, menuSelectionBorder, menuSelectionForeground, menuSeparatorBackground, pickerGroupForeground, problemsErrorIconForeground, problemsInfoIconForeground, problemsWarningIconForeground, progressBarBackground, quickInputListFocusBackground, quickInputListFocusForeground, quickInputListFocusIconForeground, resolveColorValue, scrollbarShadow, scrollbarSliderActiveBackground, scrollbarSliderBackground, scrollbarSliderHoverBackground, selectBackground, selectBorder, selectForeground, selectListBackground, checkboxBackground, checkboxBorder, checkboxForeground, tableColumnsBorder, tableOddRowsBackgroundColor, textLinkForeground, treeIndentGuidesStroke, widgetShadow, listFocusAndSelectionOutline, listFilterWidgetShadow, buttonSeparator } from 'vs/platform/theme/common/colorRegistry'; +import { activeContrastBorder, badgeBackground, badgeForeground, breadcrumbsActiveSelectionForeground, breadcrumbsBackground, breadcrumbsFocusForeground, breadcrumbsForeground, buttonBackground, buttonBorder, buttonForeground, buttonHoverBackground, buttonSecondaryBackground, buttonSecondaryForeground, buttonSecondaryHoverBackground, ColorIdentifier, ColorTransform, ColorValue, contrastBorder, editorWidgetBackground, editorWidgetBorder, editorWidgetForeground, focusBorder, inputActiveOptionBackground, inputActiveOptionBorder, inputActiveOptionForeground, inputBackground, inputBorder, inputForeground, inputValidationErrorBackground, inputValidationErrorBorder, inputValidationErrorForeground, inputValidationInfoBackground, inputValidationInfoBorder, inputValidationInfoForeground, inputValidationWarningBackground, inputValidationWarningBorder, inputValidationWarningForeground, listActiveSelectionBackground, listActiveSelectionForeground, listActiveSelectionIconForeground, listDropBackground, listFilterWidgetBackground, listFilterWidgetNoMatchesOutline, listFilterWidgetOutline, listFocusBackground, listFocusForeground, listFocusOutline, listHoverBackground, listHoverForeground, listInactiveFocusBackground, listInactiveFocusOutline, listInactiveSelectionBackground, listInactiveSelectionForeground, listInactiveSelectionIconForeground, menuBackground, menuBorder, menuForeground, menuSelectionBackground, menuSelectionBorder, menuSelectionForeground, menuSeparatorBackground, pickerGroupForeground, problemsErrorIconForeground, problemsInfoIconForeground, problemsWarningIconForeground, progressBarBackground, quickInputListFocusBackground, quickInputListFocusForeground, quickInputListFocusIconForeground, resolveColorValue, scrollbarShadow, scrollbarSliderActiveBackground, scrollbarSliderBackground, scrollbarSliderHoverBackground, selectBackground, selectBorder, selectForeground, selectListBackground, checkboxBackground, checkboxBorder, checkboxForeground, tableColumnsBorder, tableOddRowsBackgroundColor, textLinkForeground, treeIndentGuidesStroke, widgetShadow, listFocusAndSelectionOutline, listFilterWidgetShadow, buttonSeparator } from 'vs/platform/theme/common/colorRegistry'; import { isHighContrast } from 'vs/platform/theme/common/theme'; import { IColorTheme, IThemeService } from 'vs/platform/theme/common/themeService'; @@ -261,25 +261,6 @@ export function attachButtonStyler(widget: IThemable, themeService: IThemeServic buttonBorder: style?.buttonBorder || buttonBorder, } as IButtonStyleOverrides, widget); } - -export interface IKeybindingLabelStyleOverrides extends IStyleOverrides { - keybindingLabelBackground?: ColorIdentifier; - keybindingLabelForeground?: ColorIdentifier; - keybindingLabelBorder?: ColorIdentifier; - keybindingLabelBottomBorder?: ColorIdentifier; - keybindingLabelShadow?: ColorIdentifier; -} - -export function attachKeybindingLabelStyler(widget: IThemable, themeService: IThemeService, style?: IKeybindingLabelStyleOverrides): IDisposable { - return attachStyler(themeService, { - keybindingLabelBackground: (style && style.keybindingLabelBackground) || keybindingLabelBackground, - keybindingLabelForeground: (style && style.keybindingLabelForeground) || keybindingLabelForeground, - keybindingLabelBorder: (style && style.keybindingLabelBorder) || keybindingLabelBorder, - keybindingLabelBottomBorder: (style && style.keybindingLabelBottomBorder) || keybindingLabelBottomBorder, - keybindingLabelShadow: (style && style.keybindingLabelShadow) || widgetShadow - } as IKeybindingLabelStyleOverrides, widget); -} - export interface IProgressBarStyleOverrides extends IStyleOverrides { progressBarBackground?: ColorIdentifier; } diff --git a/src/vs/workbench/contrib/extensions/browser/extensionEditor.ts b/src/vs/workbench/contrib/extensions/browser/extensionEditor.ts index 63b62c591ac..e146eafbd1c 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionEditor.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionEditor.ts @@ -63,13 +63,13 @@ import { IContextMenuService } from 'vs/platform/contextview/browser/contextView import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { Delegate } from 'vs/workbench/contrib/extensions/browser/extensionsList'; import { renderMarkdown } from 'vs/base/browser/markdownRenderer'; -import { attachKeybindingLabelStyler } from 'vs/platform/theme/common/styler'; import { areSameExtensions } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { errorIcon, infoIcon, preReleaseIcon, verifiedPublisherIcon as verifiedPublisherThemeIcon, warningIcon } from 'vs/workbench/contrib/extensions/browser/extensionsIcons'; import { IPaneCompositePartService } from 'vs/workbench/services/panecomposite/browser/panecomposite'; import { ViewContainerLocation } from 'vs/workbench/common/views'; import { IExtensionGalleryService, IGalleryExtension } from 'vs/platform/extensionManagement/common/extensionManagement'; import * as semver from 'vs/base/common/semver/semver'; +import { getKeybindingLabelStyles } from 'vs/platform/theme/browser/defaultStyles'; class NavBar extends Disposable { @@ -1556,9 +1556,8 @@ export class ExtensionEditor extends EditorPane { const renderKeybinding = (keybinding: ResolvedKeybinding): HTMLElement => { const element = $(''); - const kbl = new KeybindingLabel(element, OS); + const kbl = new KeybindingLabel(element, OS, getKeybindingLabelStyles()); kbl.set(keybinding); - this.contentDisposables.add(attachKeybindingLabelStyler(kbl, this.themeService)); return element; }; diff --git a/src/vs/workbench/contrib/preferences/browser/keybindingWidgets.ts b/src/vs/workbench/contrib/preferences/browser/keybindingWidgets.ts index 6e420438c85..27abf3b0cbf 100644 --- a/src/vs/workbench/contrib/preferences/browser/keybindingWidgets.ts +++ b/src/vs/workbench/contrib/preferences/browser/keybindingWidgets.ts @@ -20,7 +20,7 @@ import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IContextViewService } from 'vs/platform/contextview/browser/contextView'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ICodeEditor, IOverlayWidget, IOverlayWidgetPosition } from 'vs/editor/browser/editorBrowser'; -import { attachInputBoxStyler, attachKeybindingLabelStyler, attachStylerCallback } from 'vs/platform/theme/common/styler'; +import { attachInputBoxStyler, attachStylerCallback } from 'vs/platform/theme/common/styler'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { editorWidgetBackground, editorWidgetForeground, widgetShadow } from 'vs/platform/theme/common/colorRegistry'; import { ScrollType } from 'vs/editor/common/editorCommon'; @@ -28,6 +28,7 @@ import { SearchWidget, SearchOptions } from 'vs/workbench/contrib/preferences/br import { withNullAsUndefined } from 'vs/base/common/types'; import { Promises, timeout } from 'vs/base/common/async'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; +import { getKeybindingLabelStyles } from 'vs/platform/theme/browser/defaultStyles'; export interface KeybindingsSearchOptions extends SearchOptions { recordEnter?: boolean; @@ -168,9 +169,6 @@ export class DefineKeybindingWidget extends Widget { private _onShowExistingKeybindings = this._register(new Emitter()); readonly onShowExistingKeybidings: Event = this._onShowExistingKeybindings.event; - private disposables = this._register(new DisposableStore()); - private keybindingLabelStylers = this.disposables.add(new DisposableStore()); - constructor( parent: HTMLElement | null, @IInstantiationService private readonly instantiationService: IInstantiationService, @@ -279,17 +277,13 @@ export class DefineKeybindingWidget extends Widget { dom.clearNode(this._outputNode); dom.clearNode(this._showExistingKeybindingsNode); - this.keybindingLabelStylers.clear(); - - const firstLabel = new KeybindingLabel(this._outputNode, OS); + const firstLabel = new KeybindingLabel(this._outputNode, OS, getKeybindingLabelStyles()); firstLabel.set(withNullAsUndefined(this._firstPart)); - this.keybindingLabelStylers.add(attachKeybindingLabelStyler(firstLabel, this.themeService)); if (this._chordPart) { this._outputNode.appendChild(document.createTextNode(nls.localize('defineKeybinding.chordsTo', "chord to"))); - const chordLabel = new KeybindingLabel(this._outputNode, OS); + const chordLabel = new KeybindingLabel(this._outputNode, OS, getKeybindingLabelStyles()); chordLabel.set(this._chordPart); - this.keybindingLabelStylers.add(attachKeybindingLabelStyler(chordLabel, this.themeService)); } const label = this.getUserSettingsLabel(); diff --git a/src/vs/workbench/contrib/preferences/browser/keybindingsEditor.ts b/src/vs/workbench/contrib/preferences/browser/keybindingsEditor.ts index 1b9edd9c0d4..7b06f4da2f8 100644 --- a/src/vs/workbench/contrib/preferences/browser/keybindingsEditor.ts +++ b/src/vs/workbench/contrib/preferences/browser/keybindingsEditor.ts @@ -8,7 +8,7 @@ import { localize } from 'vs/nls'; import { Delayer } from 'vs/base/common/async'; import * as DOM from 'vs/base/browser/dom'; import { isIOS, OS } from 'vs/base/common/platform'; -import { DisposableStore, IDisposable } from 'vs/base/common/lifecycle'; +import { DisposableStore } from 'vs/base/common/lifecycle'; import { ToggleActionViewItem } from 'vs/base/browser/ui/toggle/toggle'; import { HighlightedLabel } from 'vs/base/browser/ui/highlightedlabel/highlightedLabel'; import { KeybindingLabel } from 'vs/base/browser/ui/keybindingLabel/keybindingLabel'; @@ -35,7 +35,7 @@ import { EditorExtensionsRegistry } from 'vs/editor/browser/editorExtensions'; import { WorkbenchTable } from 'vs/platform/list/browser/listService'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { CancellationToken } from 'vs/base/common/cancellation'; -import { attachStylerCallback, attachInputBoxStyler, attachToggleStyler, attachKeybindingLabelStyler } from 'vs/platform/theme/common/styler'; +import { attachStylerCallback, attachInputBoxStyler, attachToggleStyler } from 'vs/platform/theme/common/styler'; import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; import { InputBox, MessageType } from 'vs/base/browser/ui/inputbox/inputBox'; import { Emitter, Event } from 'vs/base/common/event'; @@ -49,6 +49,7 @@ import { ITableRenderer, ITableVirtualDelegate } from 'vs/base/browser/ui/table/ import { KeybindingsEditorInput } from 'vs/workbench/services/preferences/browser/keybindingsEditorInput'; import { IEditorOptions } from 'vs/platform/editor/common/editor'; import { ToolBar } from 'vs/base/browser/ui/toolbar/toolbar'; +import { getKeybindingLabelStyles } from 'vs/platform/theme/browser/defaultStyles'; const $ = DOM.$; @@ -926,7 +927,6 @@ class CommandColumnRenderer implements ITableRenderer { @@ -935,13 +935,12 @@ class KeybindingColumnRenderer implements ITableRenderer !('mac' in entry) || entry.mac === (isMacintosh && !isWeb)) .filter(entry => !!CommandsRegistry.getCommand(entry.id)); - const keybindingLabelStylers = this.watermarkDisposable.add(new DisposableStore()); const update = () => { dom.clearNode(box); - keybindingLabelStylers.clear(); selected.map(entry => { const dl = dom.append(box, $('dl')); const dt = dom.append(dl, $('dt')); dt.textContent = entry.text; const dd = dom.append(dl, $('dd')); - const keybinding = new KeybindingLabel(dd, OS, { renderUnboundKeybindings: true }); - keybindingLabelStylers.add(attachKeybindingLabelStyler(keybinding, this.themeService)); + const keybinding = new KeybindingLabel(dd, OS, { renderUnboundKeybindings: true, ...getKeybindingLabelStyles() }); keybinding.set(this.keybindingService.lookupKeybinding(entry.id)); }); }; diff --git a/src/vs/workbench/services/decorations/browser/decorationsService.ts b/src/vs/workbench/services/decorations/browser/decorationsService.ts index c1d150de039..5670058741f 100644 --- a/src/vs/workbench/services/decorations/browser/decorationsService.ts +++ b/src/vs/workbench/services/decorations/browser/decorationsService.ts @@ -20,7 +20,7 @@ import { InstantiationType, registerSingleton } from 'vs/platform/instantiation/ import { hash } from 'vs/base/common/hash'; import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; import { asArray, distinct } from 'vs/base/common/arrays'; -import { asCssVariableName } from 'vs/platform/theme/common/colorRegistry'; +import { asCssValue, ColorIdentifier } from 'vs/platform/theme/common/colorRegistry'; import { getIconRegistry } from 'vs/platform/theme/common/iconRegistry'; class DecorationRule { @@ -235,8 +235,8 @@ class DecorationDataRequest { ) { } } -function getColor(color: string | undefined) { - return color ? `var(${asCssVariableName(color)})` : 'inherit'; +function getColor(color: ColorIdentifier | undefined) { + return color ? asCssValue(color) : 'inherit'; } type DecorationEntry = Map; From 0249ba460fff2550e007bb6d7c92889653f2887c Mon Sep 17 00:00:00 2001 From: Tyler James Leonhardt Date: Thu, 3 Nov 2022 15:50:50 -0700 Subject: [PATCH 099/185] use the actual extension id as the id in the language pack (#165436) Past behavior caused 404s to be thrown by the unpkg service because core was trying to load: `${extensionId}` -> `vscode.markdown` and not what the build creates in the language packs: `vscode.${extensionFolder}` -> `vscode.markdown-basics` this aligns build time and runtime. --- build/lib/i18n.js | 56 ++++++++++++++++++-------------------------- build/lib/i18n.ts | 59 +++++++++++++++++++---------------------------- 2 files changed, 46 insertions(+), 69 deletions(-) diff --git a/build/lib/i18n.js b/build/lib/i18n.js index b65f27227d5..61ffa3b9261 100644 --- a/build/lib/i18n.js +++ b/build/lib/i18n.js @@ -36,12 +36,6 @@ exports.extraLanguages = [ { id: 'hu', folderName: 'hun' }, { id: 'tr', folderName: 'trk' } ]; -// non built-in extensions also that are transifex and need to be part of the language packs -const externalExtensionsWithTranslations = { - 'vscode-chrome-debug': 'msjsdiag.debugger-for-chrome', - 'vscode-node-debug': 'ms-vscode.node-debug', - 'vscode-node-debug2': 'ms-vscode.node-debug2' -}; var LocalizeInfo; (function (LocalizeInfo) { function is(value) { @@ -513,10 +507,10 @@ function createXlfFilesForCoreBundle() { }); } exports.createXlfFilesForCoreBundle = createXlfFilesForCoreBundle; -function createL10nBundleForExtension(extensionName) { +function createL10nBundleForExtension(extensionFolderName) { const result = (0, event_stream_1.through)(); gulp.src([ - `extensions/${extensionName}/src/**/*.ts`, + `extensions/${extensionFolderName}/src/**/*.ts`, ]).pipe((0, event_stream_1.writeArray)((err, files) => { if (err) { result.emit('error', err); @@ -527,7 +521,7 @@ function createL10nBundleForExtension(extensionName) { })); if (Object.keys(json).length > 0) { result.emit('data', new File({ - path: `${extensionName}/bundle.l10n.json`, + path: `extensions/${extensionFolderName}/bundle.l10n.json`, contents: Buffer.from(JSON.stringify(json), 'utf8') })); } @@ -545,10 +539,14 @@ function createXlfFilesForExtensions() { if (!stat.isDirectory()) { return; } - const extensionName = path.basename(extensionFolder.path); - if (extensionName === 'node_modules') { + const extensionFolderName = path.basename(extensionFolder.path); + if (extensionFolderName === 'node_modules') { return; } + // Get extension id and use that as the id + const manifest = fs.readFileSync(path.join(extensionFolder.path, 'package.json'), 'utf-8'); + const manifestJson = JSON.parse(manifest); + const extensionId = manifestJson.publisher + '.' + manifestJson.name; counter++; let _l10nMap; function getL10nMap() { @@ -557,17 +555,17 @@ function createXlfFilesForExtensions() { } return _l10nMap; } - (0, event_stream_1.merge)(gulp.src([`.build/extensions/${extensionName}/package.nls.json`, `.build/extensions/${extensionName}/**/nls.metadata.json`], { allowEmpty: true }), createL10nBundleForExtension(extensionName)).pipe((0, event_stream_1.through)(function (file) { + (0, event_stream_1.merge)(gulp.src([`.build/extensions/${extensionFolderName}/package.nls.json`, `.build/extensions/${extensionFolderName}/**/nls.metadata.json`], { allowEmpty: true }), createL10nBundleForExtension(extensionFolderName)).pipe((0, event_stream_1.through)(function (file) { if (file.isBuffer()) { const buffer = file.contents; const basename = path.basename(file.path); if (basename === 'package.nls.json') { const json = JSON.parse(buffer.toString('utf8')); - getL10nMap().set(`extensions/${extensionName}/package`, json); + getL10nMap().set(`extensions/${extensionId}/package`, json); } else if (basename === 'nls.metadata.json') { const json = JSON.parse(buffer.toString('utf8')); - const relPath = path.relative(`.build/extensions/${extensionName}`, path.dirname(file.path)); + const relPath = path.relative(`.build/extensions/${extensionFolderName}`, path.dirname(file.path)); for (const file in json) { const fileContent = json[file]; const info = Object.create(null); @@ -578,12 +576,12 @@ function createXlfFilesForExtensions() { : { key: fileContent.keys[i], comment: undefined }; info[key] = comment ? { message, comment } : message; } - getL10nMap().set(`extensions/${extensionName}/${relPath}/${file}`, info); + getL10nMap().set(`extensions/${extensionId}/${relPath}/${file}`, info); } } else if (basename === 'bundle.l10n.json') { const json = JSON.parse(buffer.toString('utf8')); - getL10nMap().set(`extensions/${extensionName}/bundle`, json); + getL10nMap().set(`extensions/${extensionId}/bundle`, json); } else { this.emit('error', new Error(`${file.path} is not a valid extension nls file`)); @@ -593,7 +591,7 @@ function createXlfFilesForExtensions() { }, function () { if (_l10nMap?.size > 0) { const xlfFile = new File({ - path: path.join(extensionsProject, extensionName + '.xlf'), + path: path.join(extensionsProject, extensionId + '.xlf'), contents: Buffer.from((0, l10n_dev_1.getL10nXlf)(_l10nMap), 'utf8') }); folderStream.queue(xlfFile); @@ -712,18 +710,14 @@ function prepareI18nPackFiles(resultingTranslationPaths) { const path = file.name; const firstSlash = path.indexOf('/'); if (project === extensionsProject) { + // resource will be the extension id let extPack = extensionsPacks[resource]; if (!extPack) { extPack = extensionsPacks[resource] = { version: i18nPackVersion, contents: {} }; } - const externalId = externalExtensionsWithTranslations[resource]; - if (!externalId) { // internal extension: remove 'extensions/extensionId/' segnent - const secondSlash = path.indexOf('/', firstSlash + 1); - extPack.contents[path.substring(secondSlash + 1)] = getRecordFromL10nJsonFormat(file.messages); - } - else { - extPack.contents[path] = getRecordFromL10nJsonFormat(file.messages); - } + // remove 'extensions/extensionId/' segment + const secondSlash = path.indexOf('/', firstSlash + 1); + extPack.contents[path.substring(secondSlash + 1)] = getRecordFromL10nJsonFormat(file.messages); } else { mainPack.contents[path.substring(firstSlash + 1)] = getRecordFromL10nJsonFormat(file.messages); @@ -741,16 +735,10 @@ function prepareI18nPackFiles(resultingTranslationPaths) { const translatedMainFile = createI18nFile('./main', mainPack); resultingTranslationPaths.push({ id: 'vscode', resourceName: 'main.i18n.json' }); this.queue(translatedMainFile); - for (const extension in extensionsPacks) { - const translatedExtFile = createI18nFile(`extensions/${extension}`, extensionsPacks[extension]); + for (const extensionId in extensionsPacks) { + const translatedExtFile = createI18nFile(`extensions/${extensionId}`, extensionsPacks[extensionId]); this.queue(translatedExtFile); - const externalExtensionId = externalExtensionsWithTranslations[extension]; - if (externalExtensionId) { - resultingTranslationPaths.push({ id: externalExtensionId, resourceName: `extensions/${extension}.i18n.json` }); - } - else { - resultingTranslationPaths.push({ id: `vscode.${extension}`, resourceName: `extensions/${extension}.i18n.json` }); - } + resultingTranslationPaths.push({ id: extensionId, resourceName: `extensions/${extensionId}.i18n.json` }); } this.queue(null); }) diff --git a/build/lib/i18n.ts b/build/lib/i18n.ts index 8f1eaf9fe0e..4687f97b46d 100644 --- a/build/lib/i18n.ts +++ b/build/lib/i18n.ts @@ -49,13 +49,6 @@ export const extraLanguages: Language[] = [ { id: 'tr', folderName: 'trk' } ]; -// non built-in extensions also that are transifex and need to be part of the language packs -const externalExtensionsWithTranslations: Record = { - 'vscode-chrome-debug': 'msjsdiag.debugger-for-chrome', - 'vscode-node-debug': 'ms-vscode.node-debug', - 'vscode-node-debug2': 'ms-vscode.node-debug2' -}; - interface Item { id: string; message: string; @@ -586,10 +579,10 @@ export function createXlfFilesForCoreBundle(): ThroughStream { }); } -function createL10nBundleForExtension(extensionName: string): ThroughStream { +function createL10nBundleForExtension(extensionFolderName: string): ThroughStream { const result = through(); gulp.src([ - `extensions/${extensionName}/src/**/*.ts`, + `extensions/${extensionFolderName}/src/**/*.ts`, ]).pipe(writeArray((err, files: File[]) => { if (err) { result.emit('error', err); @@ -602,7 +595,7 @@ function createL10nBundleForExtension(extensionName: string): ThroughStream { if (Object.keys(json).length > 0) { result.emit('data', new File({ - path: `${extensionName}/bundle.l10n.json`, + path: `extensions/${extensionFolderName}/bundle.l10n.json`, contents: Buffer.from(JSON.stringify(json), 'utf8') })); } @@ -622,10 +615,15 @@ export function createXlfFilesForExtensions(): ThroughStream { if (!stat.isDirectory()) { return; } - const extensionName = path.basename(extensionFolder.path); - if (extensionName === 'node_modules') { + const extensionFolderName = path.basename(extensionFolder.path); + if (extensionFolderName === 'node_modules') { return; } + // Get extension id and use that as the id + const manifest = fs.readFileSync(path.join(extensionFolder.path, 'package.json'), 'utf-8'); + const manifestJson = JSON.parse(manifest); + const extensionId = manifestJson.publisher + '.' + manifestJson.name; + counter++; let _l10nMap: Map; function getL10nMap() { @@ -635,18 +633,18 @@ export function createXlfFilesForExtensions(): ThroughStream { return _l10nMap; } merge( - gulp.src([`.build/extensions/${extensionName}/package.nls.json`, `.build/extensions/${extensionName}/**/nls.metadata.json`], { allowEmpty: true }), - createL10nBundleForExtension(extensionName) + gulp.src([`.build/extensions/${extensionFolderName}/package.nls.json`, `.build/extensions/${extensionFolderName}/**/nls.metadata.json`], { allowEmpty: true }), + createL10nBundleForExtension(extensionFolderName) ).pipe(through(function (file: File) { if (file.isBuffer()) { const buffer: Buffer = file.contents as Buffer; const basename = path.basename(file.path); if (basename === 'package.nls.json') { const json: l10nJsonFormat = JSON.parse(buffer.toString('utf8')); - getL10nMap().set(`extensions/${extensionName}/package`, json); + getL10nMap().set(`extensions/${extensionId}/package`, json); } else if (basename === 'nls.metadata.json') { const json: BundledExtensionFormat = JSON.parse(buffer.toString('utf8')); - const relPath = path.relative(`.build/extensions/${extensionName}`, path.dirname(file.path)); + const relPath = path.relative(`.build/extensions/${extensionFolderName}`, path.dirname(file.path)); for (const file in json) { const fileContent = json[file]; const info: l10nJsonFormat = Object.create(null); @@ -658,11 +656,11 @@ export function createXlfFilesForExtensions(): ThroughStream { info[key] = comment ? { message, comment } : message; } - getL10nMap().set(`extensions/${extensionName}/${relPath}/${file}`, info); + getL10nMap().set(`extensions/${extensionId}/${relPath}/${file}`, info); } } else if (basename === 'bundle.l10n.json') { const json: l10nJsonFormat = JSON.parse(buffer.toString('utf8')); - getL10nMap().set(`extensions/${extensionName}/bundle`, json); + getL10nMap().set(`extensions/${extensionId}/bundle`, json); } else { this.emit('error', new Error(`${file.path} is not a valid extension nls file`)); return; @@ -671,7 +669,7 @@ export function createXlfFilesForExtensions(): ThroughStream { }, function () { if (_l10nMap?.size > 0) { const xlfFile = new File({ - path: path.join(extensionsProject, extensionName + '.xlf'), + path: path.join(extensionsProject, extensionId + '.xlf'), contents: Buffer.from(getL10nXlf(_l10nMap), 'utf8') }); folderStream.queue(xlfFile); @@ -813,17 +811,14 @@ export function prepareI18nPackFiles(resultingTranslationPaths: TranslationPath[ const firstSlash = path.indexOf('/'); if (project === extensionsProject) { + // resource will be the extension id let extPack = extensionsPacks[resource]; if (!extPack) { extPack = extensionsPacks[resource] = { version: i18nPackVersion, contents: {} }; } - const externalId = externalExtensionsWithTranslations[resource]; - if (!externalId) { // internal extension: remove 'extensions/extensionId/' segnent - const secondSlash = path.indexOf('/', firstSlash + 1); - extPack.contents[path.substring(secondSlash + 1)] = getRecordFromL10nJsonFormat(file.messages); - } else { - extPack.contents[path] = getRecordFromL10nJsonFormat(file.messages); - } + // remove 'extensions/extensionId/' segment + const secondSlash = path.indexOf('/', firstSlash + 1); + extPack.contents[path.substring(secondSlash + 1)] = getRecordFromL10nJsonFormat(file.messages); } else { mainPack.contents[path.substring(firstSlash + 1)] = getRecordFromL10nJsonFormat(file.messages); } @@ -842,17 +837,11 @@ export function prepareI18nPackFiles(resultingTranslationPaths: TranslationPath[ resultingTranslationPaths.push({ id: 'vscode', resourceName: 'main.i18n.json' }); this.queue(translatedMainFile); - for (const extension in extensionsPacks) { - const translatedExtFile = createI18nFile(`extensions/${extension}`, extensionsPacks[extension]); + for (const extensionId in extensionsPacks) { + const translatedExtFile = createI18nFile(`extensions/${extensionId}`, extensionsPacks[extensionId]); this.queue(translatedExtFile); - const externalExtensionId = externalExtensionsWithTranslations[extension]; - if (externalExtensionId) { - resultingTranslationPaths.push({ id: externalExtensionId, resourceName: `extensions/${extension}.i18n.json` }); - } else { - resultingTranslationPaths.push({ id: `vscode.${extension}`, resourceName: `extensions/${extension}.i18n.json` }); - } - + resultingTranslationPaths.push({ id: extensionId, resourceName: `extensions/${extensionId}.i18n.json` }); } this.queue(null); }) From 989f0dfa694d7a153d960185ad36cd48aadbd081 Mon Sep 17 00:00:00 2001 From: Raymond Zhao <7199958+rzhao271@users.noreply.github.com> Date: Thu, 3 Nov 2022 16:00:51 -0700 Subject: [PATCH 100/185] Use CSS variables for settingsTree.ts (#165437) Ref #165169 --- .../browser/media/settingsEditor2.css | 38 +++++++++- .../preferences/browser/settingsTree.ts | 71 ++----------------- 2 files changed, 41 insertions(+), 68 deletions(-) diff --git a/src/vs/workbench/contrib/preferences/browser/media/settingsEditor2.css b/src/vs/workbench/contrib/preferences/browser/media/settingsEditor2.css index 3321d07eebb..d1b93b033a6 100644 --- a/src/vs/workbench/contrib/preferences/browser/media/settingsEditor2.css +++ b/src/vs/workbench/contrib/preferences/browser/media/settingsEditor2.css @@ -157,6 +157,11 @@ height: 100%; } +.settings-editor > .settings-body .settings-tree-container .settings-group-title-label, +.settings-editor > .settings-body .settings-tree-container .setting-item-label { + color: var(--vscode-settings-headerForeground); +} + .settings-editor.no-results > .settings-body .settings-toc-container, .settings-editor.no-results > .settings-body .settings-tree-container { display: none; @@ -184,6 +189,19 @@ display: none !important; } +.settings-editor > .settings-body .settings-tree-container .monaco-list-row.focused .settings-row-inner-container { + background-color: var(--vscode-settings-focusedRowBackground); +} + +.settings-editor > .settings-body .settings-tree-container .monaco-list-row:not(.focused) .settings-row-inner-container:hover { + background-color: var(--vscode-settings-rowHoverBackground); +} + +.settings-editor > .settings-body .settings-tree-container .monaco-list:focus-within .monaco-list-row.focused .setting-item-contents, +.settings-editor > .settings-body .settings-tree-container .monaco-list:focus-within .monaco-list-row.focused .settings-group-title-label { + outline: 1px solid var(--vscode-settings-focusedRowBorder); +} + .settings-editor.mid-width > .settings-body .settings-tree-container .settings-editor-tree > .monaco-scrollable-element > .shadow.top { left: 0; width: calc(100% - 48px); @@ -237,6 +255,11 @@ display: none; } +.settings-editor > .settings-body .settings-toc-container .monaco-list-row:not(.selected) { + color: var(--vscode-foreground); + opacity: 0.9; +} + .settings-editor > .settings-body .settings-toc-container .monaco-list-row .monaco-tl-contents { display: flex; } @@ -360,6 +383,13 @@ font-style: italic; } +.settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-title .setting-item-overrides, +.settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-title .setting-item-ignored { + /* Hack for subpixel antialiasing */ + color: var(--vscode-foreground); + opacity: 0.9; +} + .settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-title > .misc-label .setting-item-overrides.with-custom-hover:hover, .settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-title > .misc-label .setting-item-ignored:hover, .settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-title > .misc-label .setting-item-default-overridden:hover { @@ -404,6 +434,7 @@ user-select: text; -webkit-user-select: text; display: none; + color: var(--vscode-errorForeground); } .settings-editor > .settings-body .settings-tree-container .setting-item-contents.is-deprecated .setting-item-deprecation-message { @@ -419,10 +450,15 @@ margin-top: -1px; user-select: text; -webkit-user-select: text; + color: var(--vscode-foreground); + opacity: 0.9; } .settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-validation-message { display: none; + background-color: var(--vscode-inputValidation-errorBackground); + color: var(--vscode-inputValidation-errorForeground); + border: solid 1px var(--vscode-inputValidation-errorBorder); } .settings-editor > .settings-body .settings-tree-container .setting-item .setting-item-contents.invalid-input .setting-item-validation-message { @@ -469,6 +505,7 @@ outline: 1px solid -webkit-focus-ring-color; outline-offset: -1px; text-decoration: underline; + outline-color: var(--vscode-focusBorder); } .settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-markdown a:hover, @@ -483,7 +520,6 @@ text-decoration: underline; } - .settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-markdown code { line-height: 15px; /** For some reason, this is needed, otherwise will take up 20px height */ diff --git a/src/vs/workbench/contrib/preferences/browser/settingsTree.ts b/src/vs/workbench/contrib/preferences/browser/settingsTree.ts index 0f0d16e3c12..cc65c8b5d73 100644 --- a/src/vs/workbench/contrib/preferences/browser/settingsTree.ts +++ b/src/vs/workbench/contrib/preferences/browser/settingsTree.ts @@ -19,7 +19,7 @@ import { ObjectTreeModel } from 'vs/base/browser/ui/tree/objectTreeModel'; import { ITreeFilter, ITreeModel, ITreeNode, ITreeRenderer, TreeFilterResult, TreeVisibility } from 'vs/base/browser/ui/tree/tree'; import { Action, IAction, Separator } from 'vs/base/common/actions'; import * as arrays from 'vs/base/common/arrays'; -import { Color, RGBA } from 'vs/base/common/color'; +import { Color } from 'vs/base/common/color'; import { onUnexpectedError } from 'vs/base/common/errors'; import { Emitter, Event } from 'vs/base/common/event'; import { KeyCode } from 'vs/base/common/keyCodes'; @@ -35,9 +35,9 @@ import { IContextMenuService, IContextViewService } from 'vs/platform/contextvie import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IOpenerService } from 'vs/platform/opener/common/opener'; -import { editorBackground, errorForeground, focusBorder, foreground, inputValidationErrorBackground, inputValidationErrorBorder, inputValidationErrorForeground } from 'vs/platform/theme/common/colorRegistry'; +import { editorBackground, foreground } from 'vs/platform/theme/common/colorRegistry'; import { attachButtonStyler, attachInputBoxStyler, attachSelectBoxStyler, attachStyler } from 'vs/platform/theme/common/styler'; -import { ICssStyleCollector, IColorTheme, IThemeService, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; +import { IThemeService } from 'vs/platform/theme/common/themeService'; import { getIgnoredSettings } from 'vs/platform/userDataSync/common/settingsMerge'; import { ITOCEntry } from 'vs/workbench/contrib/preferences/browser/settingsLayout'; import { inspectSetting, ISettingsEditorViewState, settingKeyToDisplayFormat, SettingsTreeElement, SettingsTreeGroupChild, SettingsTreeGroupElement, SettingsTreeNewExtensionsElement, SettingsTreeSettingElement } from 'vs/workbench/contrib/preferences/browser/settingsTreeModels'; @@ -59,7 +59,7 @@ import { IWorkbenchConfigurationService } from 'vs/workbench/services/configurat import { SettingsTarget } from 'vs/workbench/contrib/preferences/browser/preferencesWidgets'; import { MarkdownRenderer } from 'vs/editor/contrib/markdownRenderer/browser/markdownRenderer'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; -import { focusedRowBackground, focusedRowBorder, rowHoverBackground, settingsHeaderForeground, settingsNumberInputBackground, settingsNumberInputBorder, settingsNumberInputForeground, settingsSelectBackground, settingsSelectBorder, settingsSelectForeground, settingsSelectListBorder, settingsTextInputBackground, settingsTextInputBorder, settingsTextInputForeground } from 'vs/workbench/contrib/preferences/common/settingsEditorColorRegistry'; +import { settingsNumberInputBackground, settingsNumberInputBorder, settingsNumberInputForeground, settingsSelectBackground, settingsSelectBorder, settingsSelectForeground, settingsSelectListBorder, settingsTextInputBackground, settingsTextInputBorder, settingsTextInputForeground } from 'vs/workbench/contrib/preferences/common/settingsEditorColorRegistry'; import { getIndicatorsLabelAriaLabel, ISettingOverrideClickEvent, SettingsTreeIndicatorsLabel } from 'vs/workbench/contrib/preferences/browser/settingsEditorSettingIndicators'; import { ILanguageService } from 'vs/editor/common/languages/language'; import { ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry'; @@ -2276,69 +2276,6 @@ export class SettingsTree extends WorkbenchObjectTree { configurationService, ); - this.disposables.add(registerThemingParticipant((theme: IColorTheme, collector: ICssStyleCollector) => { - const foregroundColor = theme.getColor(foreground); - if (foregroundColor) { - // Links appear inside other elements in markdown. CSS opacity acts like a mask. So we have to dynamically compute the description color to avoid - // applying an opacity to the link color. - const fgWithOpacity = new Color(new RGBA(foregroundColor.rgba.r, foregroundColor.rgba.g, foregroundColor.rgba.b, 0.9)); - collector.addRule(`.settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-description { color: ${fgWithOpacity}; }`); - collector.addRule(`.settings-editor > .settings-body .settings-toc-container .monaco-list-row:not(.selected) { color: ${fgWithOpacity}; }`); - - // Hack for subpixel antialiasing - collector.addRule(`.settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-title .setting-item-overrides, - .settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-title .setting-item-ignored { color: ${fgWithOpacity}; }`); - } - - const errorColor = theme.getColor(errorForeground); - if (errorColor) { - collector.addRule(`.settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-deprecation-message { color: ${errorColor}; }`); - } - - const invalidInputBackground = theme.getColor(inputValidationErrorBackground); - if (invalidInputBackground) { - collector.addRule(`.settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-validation-message { background-color: ${invalidInputBackground}; }`); - } - - const invalidInputForeground = theme.getColor(inputValidationErrorForeground); - if (invalidInputForeground) { - collector.addRule(`.settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-validation-message { color: ${invalidInputForeground}; }`); - } - - const invalidInputBorder = theme.getColor(inputValidationErrorBorder); - if (invalidInputBorder) { - collector.addRule(`.settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-validation-message { border-style:solid; border-width: 1px; border-color: ${invalidInputBorder}; }`); - collector.addRule(`.settings-editor > .settings-body .settings-tree-container .setting-item.invalid-input .setting-item-control .monaco-inputbox.idle { outline-width: 0; border-style:solid; border-width: 1px; border-color: ${invalidInputBorder}; }`); - } - - const focusedRowBackgroundColor = theme.getColor(focusedRowBackground); - if (focusedRowBackgroundColor) { - collector.addRule(`.settings-editor > .settings-body .settings-tree-container .monaco-list-row.focused .settings-row-inner-container { background-color: ${focusedRowBackgroundColor}; }`); - } - - const rowHoverBackgroundColor = theme.getColor(rowHoverBackground); - if (rowHoverBackgroundColor) { - collector.addRule(`.settings-editor > .settings-body .settings-tree-container .monaco-list-row:not(.focused) .settings-row-inner-container:hover { background-color: ${rowHoverBackgroundColor}; }`); - } - - const focusedRowBorderColor = theme.getColor(focusedRowBorder); - if (focusedRowBorderColor) { - collector.addRule(`.settings-editor > .settings-body .settings-tree-container .monaco-list:focus-within .monaco-list-row.focused .setting-item-contents { outline: 1px solid ${focusedRowBorderColor} }`); - collector.addRule(`.settings-editor > .settings-body .settings-tree-container .monaco-list:focus-within .monaco-list-row.focused .settings-group-title-label { outline: 1px solid ${focusedRowBorderColor} }`); - } - - const headerForegroundColor = theme.getColor(settingsHeaderForeground); - if (headerForegroundColor) { - collector.addRule(`.settings-editor > .settings-body .settings-tree-container .settings-group-title-label { color: ${headerForegroundColor}; }`); - collector.addRule(`.settings-editor > .settings-body .settings-tree-container .setting-item-label { color: ${headerForegroundColor}; }`); - } - - const focusBorderColor = theme.getColor(focusBorder); - if (focusBorderColor) { - collector.addRule(`.settings-editor > .settings-body .settings-tree-container .setting-item-contents .setting-item-markdown a:focus { outline-color: ${focusBorderColor} }`); - } - })); - this.getHTMLElement().classList.add('settings-editor-tree'); this.disposables.add(attachStyler(themeService, { From d0d5aa94a0d1d2adffa3ed94da52b510421774a9 Mon Sep 17 00:00:00 2001 From: Bhavya Udayashankar Date: Thu, 3 Nov 2022 17:12:35 -0700 Subject: [PATCH 101/185] Add accessibility role type to the checkbox in getting started step --- .../contrib/welcomeGettingStarted/browser/gettingStarted.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.ts b/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.ts index b35a466ad0b..8bd03690e3e 100644 --- a/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.ts +++ b/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.ts @@ -1292,6 +1292,7 @@ export class GettingStartedPage extends EditorPane { { 'data-done-step-id': step.id, 'x-dispatch': 'toggleStepCompletion:' + step.id, + 'role': 'checkbox', }); const container = $('.step-description-container', { 'x-step-description-for': step.id }); From 84154c629d60fb42dfbfcef726b46abed69a9cf9 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 3 Nov 2022 18:59:21 -0700 Subject: [PATCH 102/185] Add typings for webview messages (#165446) --- .../webview/browser/pre/index-no-csp.html | 296 +++++++++--------- .../contrib/webview/browser/pre/index.html | 287 +++++++++-------- .../contrib/webview/browser/webviewElement.ts | 79 ++--- .../webview/browser/webviewMessages.d.ts | 85 +++++ 4 files changed, 407 insertions(+), 340 deletions(-) create mode 100644 src/vs/workbench/contrib/webview/browser/webviewMessages.d.ts diff --git a/src/vs/workbench/contrib/webview/browser/pre/index-no-csp.html b/src/vs/workbench/contrib/webview/browser/pre/index-no-csp.html index 009048a23bb..cf948d880c3 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/index-no-csp.html +++ b/src/vs/workbench/contrib/webview/browser/pre/index-no-csp.html @@ -85,92 +85,92 @@ const defaultStyles = document.createElement('style'); defaultStyles.id = '_defaultStyles'; defaultStyles.textContent = ` - html { - scrollbar-color: var(--vscode-scrollbarSlider-background) var(--vscode-editor-background); - } + html { + scrollbar-color: var(--vscode-scrollbarSlider-background) var(--vscode-editor-background); + } - body { - background-color: transparent; - color: var(--vscode-editor-foreground); - font-family: var(--vscode-font-family); - font-weight: var(--vscode-font-weight); - font-size: var(--vscode-font-size); - margin: 0; - padding: 0 20px; - } + body { + background-color: transparent; + color: var(--vscode-editor-foreground); + font-family: var(--vscode-font-family); + font-weight: var(--vscode-font-weight); + font-size: var(--vscode-font-size); + margin: 0; + padding: 0 20px; + } - img, video { - max-width: 100%; - max-height: 100%; - } + img, video { + max-width: 100%; + max-height: 100%; + } - a, a code { - color: var(--vscode-textLink-foreground); - } + a, a code { + color: var(--vscode-textLink-foreground); + } - a:hover { - color: var(--vscode-textLink-activeForeground); - } + a:hover { + color: var(--vscode-textLink-activeForeground); + } - a:focus, - input:focus, - select:focus, - textarea:focus { - outline: 1px solid -webkit-focus-ring-color; - outline-offset: -1px; - } + a:focus, + input:focus, + select:focus, + textarea:focus { + outline: 1px solid -webkit-focus-ring-color; + outline-offset: -1px; + } - code { - color: var(--vscode-textPreformat-foreground); - } + code { + color: var(--vscode-textPreformat-foreground); + } - blockquote { - background: var(--vscode-textBlockQuote-background); - border-color: var(--vscode-textBlockQuote-border); - } + blockquote { + background: var(--vscode-textBlockQuote-background); + border-color: var(--vscode-textBlockQuote-border); + } - kbd { - color: var(--vscode-editor-foreground); - border-radius: 3px; - vertical-align: middle; - padding: 1px 3px; + kbd { + color: var(--vscode-editor-foreground); + border-radius: 3px; + vertical-align: middle; + padding: 1px 3px; - background-color: hsla(0,0%,50%,.17); - border: 1px solid rgba(71,71,71,.4); - border-bottom-color: rgba(88,88,88,.4); - box-shadow: inset 0 -1px 0 rgba(88,88,88,.4); - } - .vscode-light kbd { - background-color: hsla(0,0%,87%,.5); - border: 1px solid hsla(0,0%,80%,.7); - border-bottom-color: hsla(0,0%,73%,.7); - box-shadow: inset 0 -1px 0 hsla(0,0%,73%,.7); - } + background-color: hsla(0,0%,50%,.17); + border: 1px solid rgba(71,71,71,.4); + border-bottom-color: rgba(88,88,88,.4); + box-shadow: inset 0 -1px 0 rgba(88,88,88,.4); + } + .vscode-light kbd { + background-color: hsla(0,0%,87%,.5); + border: 1px solid hsla(0,0%,80%,.7); + border-bottom-color: hsla(0,0%,73%,.7); + box-shadow: inset 0 -1px 0 hsla(0,0%,73%,.7); + } - ::-webkit-scrollbar { - width: 10px; - height: 10px; - } + ::-webkit-scrollbar { + width: 10px; + height: 10px; + } - ::-webkit-scrollbar-corner { - background-color: var(--vscode-editor-background); - } + ::-webkit-scrollbar-corner { + background-color: var(--vscode-editor-background); + } - ::-webkit-scrollbar-thumb { - background-color: var(--vscode-scrollbarSlider-background); - } - ::-webkit-scrollbar-thumb:hover { - background-color: var(--vscode-scrollbarSlider-hoverBackground); - } - ::-webkit-scrollbar-thumb:active { - background-color: var(--vscode-scrollbarSlider-activeBackground); - } - ::highlight(find-highlight) { - background-color: var(--vscode-editor-findMatchHighlightBackground); - } - ::highlight(current-find-highlight) { - background-color: var(--vscode-editor-findMatchBackground); - }`; + ::-webkit-scrollbar-thumb { + background-color: var(--vscode-scrollbarSlider-background); + } + ::-webkit-scrollbar-thumb:hover { + background-color: var(--vscode-scrollbarSlider-hoverBackground); + } + ::-webkit-scrollbar-thumb:active { + background-color: var(--vscode-scrollbarSlider-activeBackground); + } + ::highlight(find-highlight) { + background-color: var(--vscode-editor-findMatchHighlightBackground); + } + ::highlight(current-find-highlight) { + background-color: var(--vscode-editor-findMatchBackground); + }`; /** * @param {boolean} allowMultipleAPIAcquire @@ -180,40 +180,40 @@ function getVsCodeApiScript(allowMultipleAPIAcquire, state) { const encodedState = state ? encodeURIComponent(state) : undefined; return /* js */` - globalThis.acquireVsCodeApi = (function() { - const originalPostMessage = window.parent['${vscodePostMessageFuncName}'].bind(window.parent); - const doPostMessage = (channel, data, transfer) => { - originalPostMessage(channel, data, transfer); - }; + globalThis.acquireVsCodeApi = (function() { + const originalPostMessage = window.parent['${vscodePostMessageFuncName}'].bind(window.parent); + const doPostMessage = (channel, data, transfer) => { + originalPostMessage(channel, data, transfer); + }; - let acquired = false; + let acquired = false; - let state = ${state ? `JSON.parse(decodeURIComponent("${encodedState}"))` : undefined}; + let state = ${state ? `JSON.parse(decodeURIComponent("${encodedState}"))` : undefined}; - return () => { - if (acquired && !${allowMultipleAPIAcquire}) { - throw new Error('An instance of the VS Code API has already been acquired'); - } - acquired = true; - return Object.freeze({ - postMessage: function(message, transfer) { - doPostMessage('onmessage', { message, transfer }, transfer); - }, - setState: function(newState) { - state = newState; - doPostMessage('do-update-state', JSON.stringify(newState)); - return newState; - }, - getState: function() { - return state; - } - }); - }; - })(); - delete window.parent; - delete window.top; - delete window.frameElement; - `; + return () => { + if (acquired && !${allowMultipleAPIAcquire}) { + throw new Error('An instance of the VS Code API has already been acquired'); + } + acquired = true; + return Object.freeze({ + postMessage: function(message, transfer) { + doPostMessage('onmessage', { message, transfer }, transfer); + }, + setState: function(newState) { + state = newState; + doPostMessage('do-update-state', JSON.stringify(newState)); + return newState; + }, + getState: function() { + return state; + } + }); + }; + })(); + delete window.parent; + delete window.top; + delete window.frameElement; + `; } /** @type {Promise} */ @@ -278,6 +278,9 @@ }); }); + /** + * @type {import('../webviewMessages').WebviewHostMessaging} + */ const hostMessaging = new class HostMessaging { constructor() { @@ -299,19 +302,10 @@ }; } - /** - * @param {string} channel - * @param {any} data - * @param {any} [transfer] - */ postMessage(channel, data, transfer) { this.channel.port1.postMessage({ channel, data }, transfer); } - /** - * @param {string} channel - * @param {(event: MessageEvent, data: any) => void} handler - */ onMessage(channel, handler) { let handlers = this.handlers.get(channel); if (!handlers) { @@ -366,11 +360,11 @@ this.confirmBeforeClose = 'keyboardOnly'; this.isModifierKeyDown = false; - hostMessaging.onMessage('set-confirm-before-close', (_e, /** @type {string} */ data) => { + hostMessaging.onMessage('set-confirm-before-close', (_e, data) => { this.confirmBeforeClose = data; }); - hostMessaging.onMessage('content', (_e, /** @type {any} */ data) => { + hostMessaging.onMessage('content', (_e, data) => { this.confirmBeforeClose = data.confirmBeforeClose; }); @@ -402,11 +396,11 @@ } onIframeLoaded(/** @type {HTMLIFrameElement} */ frame) { - frame.contentWindow.addEventListener('keydown', e => { + assertIsDefined(frame.contentWindow).addEventListener('keydown', e => { this.isModifierKeyDown = e.metaKey || e.ctrlKey || e.altKey; }); - frame.contentWindow.addEventListener('keyup', () => { + assertIsDefined(frame.contentWindow).addEventListener('keyup', () => { this.isModifierKeyDown = false; }); } @@ -544,7 +538,7 @@ event.view.scrollTo(0, 0); } } else { - hostMessaging.postMessage('did-click-link', node.href.baseVal || node.href); + hostMessaging.postMessage('did-click-link', { uri: node.href.baseVal || node.href }); } event.preventDefault(); return; @@ -581,7 +575,7 @@ // make sure we block the browser from dispatching it. Instead VS Code // handles these events and will dispatch a copy/paste back to the webview // if needed - if (isUndoRedo(e) || isPrint(e) || isFindEvent(e)) { + if (isUndoRedo(e) || isPrint(e) || isFindEvent(e) || isSaveEvent(e)) { e.preventDefault(); } else if (isCopyPasteOrCut(e)) { if (onElectron) { @@ -659,6 +653,15 @@ return hasMeta && e.key.toLowerCase() === 'f'; } + /** + * @param {KeyboardEvent} e + * @return {boolean} + */ + function isSaveEvent(e) { + const hasMeta = e.ctrlKey || e.metaKey; + return hasMeta && e.key.toLowerCase() === 's'; + } + /** * @param {KeyboardEvent} e * @return {boolean} @@ -719,7 +722,7 @@ isHandlingScroll = true; window.requestAnimationFrame(() => { try { - hostMessaging.postMessage('did-scroll', progress); + hostMessaging.postMessage('did-scroll', { scrollYPercentage: progress }); } catch (e) { // noop } @@ -739,7 +742,7 @@ // Only handle drags from outside editor for now if (e.dataTransfer.items.length && Array.prototype.every.call(e.dataTransfer.items, item => item.kind === 'file')) { - hostMessaging.postMessage('drag-start'); + hostMessaging.postMessage('drag-start', undefined); } } @@ -823,7 +826,7 @@ // Check for CSP const csp = newDocument.querySelector('meta[http-equiv="Content-Security-Policy"]'); if (!csp) { - hostMessaging.postMessage('no-csp-found'); + hostMessaging.postMessage('no-csp-found', undefined); } else { try { // Attempt to rewrite CSPs that hardcode old-style resource endpoint @@ -953,18 +956,18 @@ } newFrame.setAttribute('sandbox', Array.from(sandboxRules).join(' ')); - const allowRules = ['cross-origin-isolated;'] - if(!isFirefox && options.allowScripts) { - allowRules.push('clipboard-read;','clipboard-write;') + const allowRules = ['cross-origin-isolated;']; + if (!isFirefox && options.allowScripts) { + allowRules.push('clipboard-read;', 'clipboard-write;'); } newFrame.setAttribute('allow', allowRules.join(' ')); // We should just be able to use srcdoc, but I wasn't // seeing the service worker applying properly. // Fake load an empty on the correct origin and then write real html // into it to get around this. - const fakeUrlParams = new URLSearchParams({id: ID}); - if(globalThis.crossOriginIsolated) { - fakeUrlParams.set('vscode-coi', '3') /*COOP+COEP*/ + const fakeUrlParams = new URLSearchParams({ id: ID }); + if (globalThis.crossOriginIsolated) { + fakeUrlParams.set('vscode-coi', '3'); /*COOP+COEP*/ } newFrame.src = `./fake.html?${fakeUrlParams.toString()}`; @@ -1087,9 +1090,10 @@ e.preventDefault(); + /** @type { Record} */ let context = {}; - /** @type HTMLElement */ + /** @type {HTMLElement | null} */ let el = e.target; while (true) { if (!el) { @@ -1105,7 +1109,7 @@ try { context = { ...JSON.parse(el.dataset.vscodeContext), ...context }; } catch (e) { - console.error(`Error parsing 'data-vscode-context' as json`, el, e) + console.error(`Error parsing 'data-vscode-context' as json`, el, e); } el = el.parentElement; @@ -1126,7 +1130,7 @@ }); // Forward message to the embedded iframe - hostMessaging.onMessage('message', (_event, /** @type {{message: any, transfer?: ArrayBuffer[] }} */ data) => { + hostMessaging.onMessage('message', (_event, data) => { const pending = getPendingFrame(); if (!pending) { const target = getActiveFrame(); @@ -1159,20 +1163,22 @@ return; } - if (!data.previous && lastFindValue !== data.value) { + if (!data.previous && lastFindValue !== data.value && target.contentWindow) { // Reset selection so we start search at the head of the last search const selection = target.contentWindow.getSelection(); - selection.collapse(selection.anchorNode); + if (selection) { + selection.collapse(selection.anchorNode); + } } lastFindValue = data.value; const didFind = (/** @type {any} */ (target.contentWindow)).find( data.value, - /* caseSensitive*/ false, - /* backwards*/ data.previous, - /* wrapAround*/ true, - /* wholeWord */ false, - /* searchInFrames*/ false, + /* caseSensitive*/ false, + /* backwards*/ data.previous, + /* wrapAround*/ true, + /* wholeWord */ false, + /* searchInFrames*/ false, false); hostMessaging.postMessage('did-find', didFind); }); @@ -1185,17 +1191,19 @@ lastFindValue = undefined; - if (!data.clearSelection) { + if (!data.clearSelection && target.contentWindow) { const selection = target.contentWindow.getSelection(); - for (let i = 0; i < selection.rangeCount; i++) { - selection.removeRange(selection.getRangeAt(i)); + if (selection) { + for (let i = 0; i < selection.rangeCount; i++) { + selection.removeRange(selection.getRangeAt(i)); + } } } }); trackFocus({ - onFocus: () => hostMessaging.postMessage('did-focus'), - onBlur: () => hostMessaging.postMessage('did-blur') + onFocus: () => hostMessaging.postMessage('did-focus', undefined), + onBlur: () => hostMessaging.postMessage('did-blur', undefined) }); (/** @type {any} */ (window))[vscodePostMessageFuncName] = (/** @type {string} */ command, /** @type {any} */ data) => { diff --git a/src/vs/workbench/contrib/webview/browser/pre/index.html b/src/vs/workbench/contrib/webview/browser/pre/index.html index 0fb3e7456d0..fdedff6fdfd 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/index.html +++ b/src/vs/workbench/contrib/webview/browser/pre/index.html @@ -5,7 +5,7 @@ + content="default-src 'none'; script-src 'sha256-jFyDxjOb3XBdk72ii0ggD0YVP/0gCVB58U2Vw6T/7/U=' 'self'; frame-src 'self'; style-src 'unsafe-inline';"> { - originalPostMessage(channel, data, transfer); - }; + globalThis.acquireVsCodeApi = (function() { + const originalPostMessage = window.parent['${vscodePostMessageFuncName}'].bind(window.parent); + const doPostMessage = (channel, data, transfer) => { + originalPostMessage(channel, data, transfer); + }; - let acquired = false; + let acquired = false; - let state = ${state ? `JSON.parse(decodeURIComponent("${encodedState}"))` : undefined}; + let state = ${state ? `JSON.parse(decodeURIComponent("${encodedState}"))` : undefined}; - return () => { - if (acquired && !${allowMultipleAPIAcquire}) { - throw new Error('An instance of the VS Code API has already been acquired'); - } - acquired = true; - return Object.freeze({ - postMessage: function(message, transfer) { - doPostMessage('onmessage', { message, transfer }, transfer); - }, - setState: function(newState) { - state = newState; - doPostMessage('do-update-state', JSON.stringify(newState)); - return newState; - }, - getState: function() { - return state; - } - }); - }; - })(); - delete window.parent; - delete window.top; - delete window.frameElement; - `; + return () => { + if (acquired && !${allowMultipleAPIAcquire}) { + throw new Error('An instance of the VS Code API has already been acquired'); + } + acquired = true; + return Object.freeze({ + postMessage: function(message, transfer) { + doPostMessage('onmessage', { message, transfer }, transfer); + }, + setState: function(newState) { + state = newState; + doPostMessage('do-update-state', JSON.stringify(newState)); + return newState; + }, + getState: function() { + return state; + } + }); + }; + })(); + delete window.parent; + delete window.top; + delete window.frameElement; + `; } /** @type {Promise} */ @@ -279,6 +279,9 @@ }); }); + /** + * @type {import('../webviewMessages').WebviewHostMessaging} + */ const hostMessaging = new class HostMessaging { constructor() { @@ -300,19 +303,10 @@ }; } - /** - * @param {string} channel - * @param {any} data - * @param {any} [transfer] - */ postMessage(channel, data, transfer) { this.channel.port1.postMessage({ channel, data }, transfer); } - /** - * @param {string} channel - * @param {(event: MessageEvent, data: any) => void} handler - */ onMessage(channel, handler) { let handlers = this.handlers.get(channel); if (!handlers) { @@ -367,11 +361,11 @@ this.confirmBeforeClose = 'keyboardOnly'; this.isModifierKeyDown = false; - hostMessaging.onMessage('set-confirm-before-close', (_e, /** @type {string} */ data) => { + hostMessaging.onMessage('set-confirm-before-close', (_e, data) => { this.confirmBeforeClose = data; }); - hostMessaging.onMessage('content', (_e, /** @type {any} */ data) => { + hostMessaging.onMessage('content', (_e, data) => { this.confirmBeforeClose = data.confirmBeforeClose; }); @@ -403,11 +397,11 @@ } onIframeLoaded(/** @type {HTMLIFrameElement} */ frame) { - frame.contentWindow.addEventListener('keydown', e => { + assertIsDefined(frame.contentWindow).addEventListener('keydown', e => { this.isModifierKeyDown = e.metaKey || e.ctrlKey || e.altKey; }); - frame.contentWindow.addEventListener('keyup', () => { + assertIsDefined(frame.contentWindow).addEventListener('keyup', () => { this.isModifierKeyDown = false; }); } @@ -545,7 +539,7 @@ event.view.scrollTo(0, 0); } } else { - hostMessaging.postMessage('did-click-link', node.href.baseVal || node.href); + hostMessaging.postMessage('did-click-link', { uri: node.href.baseVal || node.href }); } event.preventDefault(); return; @@ -729,7 +723,7 @@ isHandlingScroll = true; window.requestAnimationFrame(() => { try { - hostMessaging.postMessage('did-scroll', progress); + hostMessaging.postMessage('did-scroll', { scrollYPercentage: progress }); } catch (e) { // noop } @@ -749,7 +743,7 @@ // Only handle drags from outside editor for now if (e.dataTransfer.items.length && Array.prototype.every.call(e.dataTransfer.items, item => item.kind === 'file')) { - hostMessaging.postMessage('drag-start'); + hostMessaging.postMessage('drag-start', undefined); } } @@ -833,7 +827,7 @@ // Check for CSP const csp = newDocument.querySelector('meta[http-equiv="Content-Security-Policy"]'); if (!csp) { - hostMessaging.postMessage('no-csp-found'); + hostMessaging.postMessage('no-csp-found', undefined); } else { try { // Attempt to rewrite CSPs that hardcode old-style resource endpoint @@ -963,18 +957,18 @@ } newFrame.setAttribute('sandbox', Array.from(sandboxRules).join(' ')); - const allowRules = ['cross-origin-isolated;'] - if(!isFirefox && options.allowScripts) { - allowRules.push('clipboard-read;','clipboard-write;') + const allowRules = ['cross-origin-isolated;']; + if (!isFirefox && options.allowScripts) { + allowRules.push('clipboard-read;', 'clipboard-write;'); } newFrame.setAttribute('allow', allowRules.join(' ')); // We should just be able to use srcdoc, but I wasn't // seeing the service worker applying properly. // Fake load an empty on the correct origin and then write real html // into it to get around this. - const fakeUrlParams = new URLSearchParams({id: ID}); - if(globalThis.crossOriginIsolated) { - fakeUrlParams.set('vscode-coi', '3') /*COOP+COEP*/ + const fakeUrlParams = new URLSearchParams({ id: ID }); + if (globalThis.crossOriginIsolated) { + fakeUrlParams.set('vscode-coi', '3'); /*COOP+COEP*/ } newFrame.src = `./fake.html?${fakeUrlParams.toString()}`; @@ -1097,9 +1091,10 @@ e.preventDefault(); + /** @type { Record} */ let context = {}; - /** @type HTMLElement */ + /** @type {HTMLElement | null} */ let el = e.target; while (true) { if (!el) { @@ -1115,7 +1110,7 @@ try { context = { ...JSON.parse(el.dataset.vscodeContext), ...context }; } catch (e) { - console.error(`Error parsing 'data-vscode-context' as json`, el, e) + console.error(`Error parsing 'data-vscode-context' as json`, el, e); } el = el.parentElement; @@ -1136,7 +1131,7 @@ }); // Forward message to the embedded iframe - hostMessaging.onMessage('message', (_event, /** @type {{message: any, transfer?: ArrayBuffer[] }} */ data) => { + hostMessaging.onMessage('message', (_event, data) => { const pending = getPendingFrame(); if (!pending) { const target = getActiveFrame(); @@ -1169,20 +1164,22 @@ return; } - if (!data.previous && lastFindValue !== data.value) { + if (!data.previous && lastFindValue !== data.value && target.contentWindow) { // Reset selection so we start search at the head of the last search const selection = target.contentWindow.getSelection(); - selection.collapse(selection.anchorNode); + if (selection) { + selection.collapse(selection.anchorNode); + } } lastFindValue = data.value; const didFind = (/** @type {any} */ (target.contentWindow)).find( data.value, - /* caseSensitive*/ false, - /* backwards*/ data.previous, - /* wrapAround*/ true, - /* wholeWord */ false, - /* searchInFrames*/ false, + /* caseSensitive*/ false, + /* backwards*/ data.previous, + /* wrapAround*/ true, + /* wholeWord */ false, + /* searchInFrames*/ false, false); hostMessaging.postMessage('did-find', didFind); }); @@ -1195,17 +1192,19 @@ lastFindValue = undefined; - if (!data.clearSelection) { + if (!data.clearSelection && target.contentWindow) { const selection = target.contentWindow.getSelection(); - for (let i = 0; i < selection.rangeCount; i++) { - selection.removeRange(selection.getRangeAt(i)); + if (selection) { + for (let i = 0; i < selection.rangeCount; i++) { + selection.removeRange(selection.getRangeAt(i)); + } } } }); trackFocus({ - onFocus: () => hostMessaging.postMessage('did-focus'), - onBlur: () => hostMessaging.postMessage('did-blur') + onFocus: () => hostMessaging.postMessage('did-focus', undefined), + onBlur: () => hostMessaging.postMessage('did-blur', undefined) }); (/** @type {any} */ (window))[vscodePostMessageFuncName] = (/** @type {string} */ command, /** @type {any} */ data) => { diff --git a/src/vs/workbench/contrib/webview/browser/webviewElement.ts b/src/vs/workbench/contrib/webview/browser/webviewElement.ts index bb16d3bfd3b..5bcf70c66a3 100644 --- a/src/vs/workbench/contrib/webview/browser/webviewElement.ts +++ b/src/vs/workbench/contrib/webview/browser/webviewElement.ts @@ -35,31 +35,9 @@ import { loadLocalResource, WebviewResourceResponse } from 'vs/workbench/contrib import { WebviewThemeDataProvider } from 'vs/workbench/contrib/webview/browser/themeing'; import { areWebviewContentOptionsEqual, IWebview, WebviewContentOptions, WebviewExtensionDescription, WebviewInitInfo, WebviewMessageReceivedEvent, WebviewOptions } from 'vs/workbench/contrib/webview/browser/webview'; import { WebviewFindDelegate, WebviewFindWidget } from 'vs/workbench/contrib/webview/browser/webviewFindWidget'; +import { FromWebviewMessage, ToWebviewMessage } from 'vs/workbench/contrib/webview/browser/webviewMessages'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; -const enum WebviewMessageChannels { - onmessage = 'onmessage', - didClickLink = 'did-click-link', - didScroll = 'did-scroll', - didFocus = 'did-focus', - didBlur = 'did-blur', - didLoad = 'did-load', - didFind = 'did-find', - doUpdateState = 'do-update-state', - doReload = 'do-reload', - setConfirmBeforeClose = 'set-confirm-before-close', - loadResource = 'load-resource', - loadLocalhost = 'load-localhost', - webviewReady = 'webview-ready', - wheel = 'did-scroll-wheel', - fatalError = 'fatal-error', - noCspFound = 'no-csp-found', - didKeydown = 'did-keydown', - didKeyup = 'did-keyup', - didContextMenu = 'did-context-menu', - dragStart = 'drag-start', -} - interface IKeydownEvent { key: string; keyCode: number; @@ -232,7 +210,7 @@ export class WebviewElement extends Disposable implements IWebview, WebviewFindD return; } - if (e.data.channel === WebviewMessageChannels.webviewReady) { + if (e.data.channel === 'webview-ready') { if (this._messagePort) { return; } @@ -260,66 +238,63 @@ export class WebviewElement extends Disposable implements IWebview, WebviewFindD } })); - this._register(this.on(WebviewMessageChannels.noCspFound, () => { + this._register(this.on('no-csp-found', () => { this.handleNoCspFound(); })); - this._register(this.on(WebviewMessageChannels.didClickLink, (uri: string) => { + this._register(this.on('did-click-link', ({ uri }) => { this._onDidClickLink.fire(uri); })); - this._register(this.on(WebviewMessageChannels.onmessage, (data: { message: any; transfer?: ArrayBuffer[] }) => { - this._onMessage.fire({ - message: data.message, - transfer: data.transfer, - }); + this._register(this.on('onmessage', ({ message, transfer }) => { + this._onMessage.fire({ message, transfer }); })); - this._register(this.on(WebviewMessageChannels.didScroll, (scrollYPercentage: number) => { - this._onDidScroll.fire({ scrollYPercentage: scrollYPercentage }); + this._register(this.on('did-scroll', ({ scrollYPercentage }) => { + this._onDidScroll.fire({ scrollYPercentage }); })); - this._register(this.on(WebviewMessageChannels.doReload, () => { + this._register(this.on('do-reload', () => { this.reload(); })); - this._register(this.on(WebviewMessageChannels.doUpdateState, (state: any) => { + this._register(this.on('do-update-state', ({ state }) => { this.state = state; this._onDidUpdateState.fire(state); })); - this._register(this.on(WebviewMessageChannels.didFocus, () => { + this._register(this.on('did-focus', () => { this.handleFocusChange(true); })); - this._register(this.on(WebviewMessageChannels.didBlur, () => { + this._register(this.on('did-blur', () => { this.handleFocusChange(false); })); - this._register(this.on(WebviewMessageChannels.wheel, (event: IMouseWheelEvent) => { + this._register(this.on('did-scroll-wheel', (event) => { this._onDidWheel.fire(event); })); - this._register(this.on(WebviewMessageChannels.didFind, (didFind: boolean) => { + this._register(this.on('did-find', ({ didFind }) => { this._hasFindResult.fire(didFind); })); - this._register(this.on<{ message: string }>(WebviewMessageChannels.fatalError, (e) => { + this._register(this.on('fatal-error', (e) => { notificationService.error(localize('fatalErrorMessage', "Error loading webview: {0}", e.message)); })); - this._register(this.on(WebviewMessageChannels.didKeydown, (data: KeyboardEvent) => { + this._register(this.on('did-keydown', (data) => { // Electron: workaround for https://github.com/electron/electron/issues/14258 // We have to detect keyboard events in the and dispatch them to our // keybinding service because these events do not bubble to the parent window anymore. this.handleKeyEvent('keydown', data); })); - this._register(this.on(WebviewMessageChannels.didKeyup, (data: KeyboardEvent) => { + this._register(this.on('did-keyup', (data) => { this.handleKeyEvent('keyup', data); })); - this._register(this.on(WebviewMessageChannels.didContextMenu, (data: { clientX: number; clientY: number; context: { [key: string]: unknown } }) => { + this._register(this.on('did-context-menu', (data) => { if (!this.element) { return; } @@ -343,7 +318,7 @@ export class WebviewElement extends Disposable implements IWebview, WebviewFindD }); })); - this._register(this.on(WebviewMessageChannels.loadResource, async (entry: { id: number; path: string; query: string; scheme: string; authority: string; ifNoneMatch?: string }) => { + this._register(this.on('load-resource', async (entry) => { try { // Restore the authority we previously encoded const authority = decodeAuthority(entry.authority); @@ -363,7 +338,7 @@ export class WebviewElement extends Disposable implements IWebview, WebviewFindD } })); - this._register(this.on(WebviewMessageChannels.loadLocalhost, (entry: any) => { + this._register(this.on('load-localhost', (entry) => { this.localLocalhost(entry.id, entry.origin); })); @@ -376,11 +351,11 @@ export class WebviewElement extends Disposable implements IWebview, WebviewFindD this._register(configurationService.onDidChangeConfiguration(e => { if (e.affectsConfiguration('window.confirmBeforeClose')) { this._confirmBeforeClose = configurationService.getValue('window.confirmBeforeClose'); - this._send(WebviewMessageChannels.setConfirmBeforeClose, this._confirmBeforeClose); + this._send('set-confirm-before-close', this._confirmBeforeClose); } })); - this._register(this.on(WebviewMessageChannels.dragStart, () => { + this._register(this.on('drag-start', () => { this._startBlockingIframeDragEvents(); })); @@ -456,7 +431,7 @@ export class WebviewElement extends Disposable implements IWebview, WebviewFindD return this._send('message', { message, transfer }); } - private async _send(channel: string, data?: any, _createElement: Transferable[] = []): Promise { + private async _send(channel: K, data: ToWebviewMessage[K], _createElement: Transferable[] = []): Promise { if (this._state.type === WebviewState.Type.Initializing) { let resolve: (x: boolean) => void; const promise = new Promise(r => resolve = r); @@ -585,7 +560,7 @@ export class WebviewElement extends Disposable implements IWebview, WebviewFindD return false; } - private on(channel: WebviewMessageChannels, handler: (data: T, e: MessageEvent) => void): IDisposable { + private on(channel: K, handler: (data: FromWebviewMessage[K], e: MessageEvent) => void): IDisposable { let handlers = this._messageHandlers.get(channel); if (!handlers) { handlers = new Set(); @@ -627,7 +602,7 @@ export class WebviewElement extends Disposable implements IWebview, WebviewFindD public reload(): void { this.doUpdateContent(this._content); - const subscription = this._register(this.on(WebviewMessageChannels.didLoad, () => { + const subscription = this._register(this.on('did-load', () => { this._onDidReload.fire(); subscription.dispose(); })); @@ -876,7 +851,7 @@ export class WebviewElement extends Disposable implements IWebview, WebviewFindD return; } - this._send('focus'); + this._send('focus', undefined); }); } @@ -912,7 +887,7 @@ export class WebviewElement extends Disposable implements IWebview, WebviewFindD if (!this.element) { return; } - this._send('find-stop', { keepSelection }); + this._send('find-stop', { clearSelection: !keepSelection }); this._onDidStopFind.fire(); } diff --git a/src/vs/workbench/contrib/webview/browser/webviewMessages.d.ts b/src/vs/workbench/contrib/webview/browser/webviewMessages.d.ts new file mode 100644 index 00000000000..821df6f8d9d --- /dev/null +++ b/src/vs/workbench/contrib/webview/browser/webviewMessages.d.ts @@ -0,0 +1,85 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import type { IMouseWheelEvent } from 'vs/base/browser/mouseEvent'; +import type { WebviewStyles } from 'vs/workbench/contrib/webview/browser/webview'; + +type KeyEvent = { + key: string; + keyCode: number; + code: string; + shiftKey: boolean; + altKey: boolean; + ctrlKey: boolean; + metaKey: boolean; + repeat: boolean; +} + +export type FromWebviewMessage = { + 'onmessage': { message: any; transfer?: ArrayBuffer[] }; + 'did-click-link': { uri: string }; + 'did-scroll': { scrollYPercentage: number }; + 'did-focus': void; + 'did-blur': void; + 'did-load': void; + 'did-find': { didFind: boolean }; + 'do-update-state': { state: any }; + 'do-reload': void; + 'load-resource': { id: number; path: string; query: string; scheme: string; authority: string; ifNoneMatch?: string }; + 'load-localhost': { id: string; origin: string }; + 'did-scroll-wheel': IMouseWheelEvent; + 'fatal-error': { message: string }; + 'no-csp-found': void; + 'did-keydown': KeyEvent; + 'did-keyup': KeyEvent; + 'did-context-menu': { clientX: number; clientY: number; context: { [key: string]: unknown } }; + 'drag-start': void; +}; + +export type ToWebviewMessage = { + 'focus': void; + 'message': { message: any; transfer?: ArrayBuffer[] }; + 'execCommand': string; + 'did-load-resource': + | { id: number; status: 401 | 404; path: string } + | { id: number; status: 304; path: string; mime: string; mtime: number | undefined } + | { id: number; status: 200; path: string; mime: string; data: any; etag: string | undefined; mtime: number | undefined } + ; + 'did-load-localhost': { + id: string; + origin: string; + location: string | undefined; + }; + 'set-confirm-before-close': string; + 'initial-scroll-position': number; + 'content': { + contents: string; + options: { + allowMultipleAPIAcquire: boolean; + allowScripts: boolean; + allowForms: boolean; + }; + state: any; + cspSource: string; + confirmBeforeClose: string; + }; + 'styles': { + styles: WebviewStyles; + activeTheme: string; + themeId: string; + themeLabel: string; + reduceMotion: boolean; + screenReader: boolean; + }; + 'find': { value: string; previous?: boolean }; + 'find-stop': { clearSelection?: boolean }; +}; + + +export interface WebviewHostMessaging { + postMessage(channel: K, data: FromWebviewMessage[K], transfer?: []): void; + + onMessage(channel: K, handler: (e: Event, data: ToWebviewMessage[K]) => void): void; +} From e764c5b816a99eb8673b2fc4fc028827f202872f Mon Sep 17 00:00:00 2001 From: Megan Rogge Date: Thu, 3 Nov 2022 20:00:09 -0700 Subject: [PATCH 103/185] fix #165434 (#165440) --- src/vs/workbench/contrib/terminal/browser/media/terminal.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/terminal/browser/media/terminal.css b/src/vs/workbench/contrib/terminal/browser/media/terminal.css index 395aa6c2348..506569923d0 100644 --- a/src/vs/workbench/contrib/terminal/browser/media/terminal.css +++ b/src/vs/workbench/contrib/terminal/browser/media/terminal.css @@ -466,7 +466,7 @@ color: var(--vscode-terminalCommandDecoration-defaultBackground); } .terminal-command-decoration.quick-fix { - color: var(--vscode-editorLightbulb-foreground); + color: var(--vscode-editorLightBulb-foreground) !important; background-color: var(--vscode-terminal-background, --vscode-panel-background); } From cd29f751eb104fb30e962ddb380e2512f625ae62 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Fri, 4 Nov 2022 01:49:49 -0700 Subject: [PATCH 104/185] Adopt l10n for markdown extension (#165448) For #164438 Also makes our eslint rules understand `vscode.l10n.t(` --- .../code-no-unexternalized-strings.ts | 22 +++++++++++++ .../markdown-language-features/package.json | 1 - .../src/client/client.ts | 4 +-- .../src/commands/insertResource.ts | 12 +++---- .../src/languageFeatures/diagnostics.ts | 4 +-- .../src/languageFeatures/fileReferences.ts | 7 ++-- .../src/languageFeatures/linkUpdater.ts | 20 ++++++------ .../src/preview/documentRenderer.ts | 16 +++------- .../src/preview/preview.ts | 12 +++---- .../src/preview/previewManager.ts | 5 +-- .../src/preview/security.ts | 32 ++++++++----------- .../markdown-language-features/yarn.lock | 5 --- 12 files changed, 62 insertions(+), 78 deletions(-) diff --git a/.eslintplugin/code-no-unexternalized-strings.ts b/.eslintplugin/code-no-unexternalized-strings.ts index d0c30527f7c..0dc36ff800d 100644 --- a/.eslintplugin/code-no-unexternalized-strings.ts +++ b/.eslintplugin/code-no-unexternalized-strings.ts @@ -85,6 +85,27 @@ export = new class NoUnexternalizedStrings implements eslint.Rule.RuleModule { } } + function visitL10NCall(node: TSESTree.CallExpression) { + + // localize(key, message) + const [messageNode] = (node).arguments; + + // remove message-argument from doubleQuoted list and make + // sure it is a string-literal + if (isStringLiteral(messageNode)) { + doubleQuotedStringLiterals.delete(messageNode); + } else if (messageNode.type === AST_NODE_TYPES.ObjectExpression) { + for (const prop of messageNode.properties) { + if (prop.type === AST_NODE_TYPES.Property) { + if (prop.key.type === AST_NODE_TYPES.Identifier && prop.key.name === 'message') { + doubleQuotedStringLiterals.delete(prop.value); + break; + } + } + } + } + } + function reportBadStringsAndBadKeys() { // (1) // report all strings that are in double quotes @@ -118,6 +139,7 @@ export = new class NoUnexternalizedStrings implements eslint.Rule.RuleModule { ['Literal']: (node: any) => collectDoubleQuotedStrings(node), ['ExpressionStatement[directive] Literal:exit']: (node: any) => doubleQuotedStringLiterals.delete(node), ['CallExpression[callee.type="MemberExpression"][callee.object.name="nls"][callee.property.name="localize"]:exit']: (node: any) => visitLocalizeCall(node), + ['CallExpression[callee.type="MemberExpression"][callee.object.property.name="l10n"][callee.property.name="t"]:exit']: (node: any) => visitL10NCall(node), ['CallExpression[callee.name="localize"][arguments.length>=2]:exit']: (node: any) => visitLocalizeCall(node), ['Program:exit']: reportBadStringsAndBadKeys, }; diff --git a/extensions/markdown-language-features/package.json b/extensions/markdown-language-features/package.json index 960939ed7b9..a2d6c46a4c8 100644 --- a/extensions/markdown-language-features/package.json +++ b/extensions/markdown-language-features/package.json @@ -628,7 +628,6 @@ "morphdom": "^2.6.1", "picomatch": "^2.3.1", "vscode-languageclient": "^8.0.2", - "vscode-nls": "^5.2.0", "vscode-uri": "^3.0.3" }, "devDependencies": { diff --git a/extensions/markdown-language-features/src/client/client.ts b/extensions/markdown-language-features/src/client/client.ts index 118a71dd473..82fbc7edaed 100644 --- a/extensions/markdown-language-features/src/client/client.ts +++ b/extensions/markdown-language-features/src/client/client.ts @@ -5,7 +5,6 @@ import * as vscode from 'vscode'; import { BaseLanguageClient, LanguageClientOptions, NotebookDocumentSyncRegistrationType } from 'vscode-languageclient'; -import * as nls from 'vscode-nls'; import { IMdParser } from '../markdownEngine'; import * as proto from './protocol'; import { looksLikeMarkdownPath, markdownFileExtensions } from '../util/file'; @@ -13,7 +12,6 @@ import { VsCodeMdWorkspace } from './workspace'; import { FileWatcherManager } from './fileWatchingManager'; import { IDisposable } from '../util/dispose'; -const localize = nls.loadMessageBundle(); export type LanguageClientConstructor = (name: string, description: string, clientOptions: LanguageClientOptions) => BaseLanguageClient; @@ -64,7 +62,7 @@ export async function startClient(factory: LanguageClientConstructor, parser: IM }, }; - const client = factory('markdown', localize('markdownServer.name', 'Markdown Language Server'), clientOptions); + const client = factory('markdown', vscode.l10n.t("Markdown Language Server"), clientOptions); client.registerProposedFeatures(); diff --git a/extensions/markdown-language-features/src/commands/insertResource.ts b/extensions/markdown-language-features/src/commands/insertResource.ts index aef9bf648b8..66041df75d3 100644 --- a/extensions/markdown-language-features/src/commands/insertResource.ts +++ b/extensions/markdown-language-features/src/commands/insertResource.ts @@ -4,14 +4,12 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; -import * as nls from 'vscode-nls'; import { Utils } from 'vscode-uri'; import { Command } from '../commandManager'; import { createUriListSnippet, getParentDocumentUri, imageFileExtensions } from '../languageFeatures/dropIntoEditor'; import { coalesce } from '../util/arrays'; import { Schemes } from '../util/schemes'; -const localize = nls.loadMessageBundle(); export class InsertLinkFromWorkspace implements Command { @@ -27,8 +25,8 @@ export class InsertLinkFromWorkspace implements Command { canSelectFiles: true, canSelectFolders: false, canSelectMany: true, - openLabel: localize('insertLink.openLabel', "Insert link"), - title: localize('insertLink.title', "Insert link"), + openLabel: vscode.l10n.t("Insert link"), + title: vscode.l10n.t("Insert link"), defaultUri: getDefaultUri(activeEditor.document), }); @@ -50,10 +48,10 @@ export class InsertImageFromWorkspace implements Command { canSelectFolders: false, canSelectMany: true, filters: { - [localize('insertImage.imagesLabel', "Images")]: Array.from(imageFileExtensions) + [vscode.l10n.t("Images")]: Array.from(imageFileExtensions) }, - openLabel: localize('insertImage.openLabel', "Insert image"), - title: localize('insertImage.title', "Insert image"), + openLabel: vscode.l10n.t("Insert image"), + title: vscode.l10n.t("Insert image"), defaultUri: getDefaultUri(activeEditor.document), }); diff --git a/extensions/markdown-language-features/src/languageFeatures/diagnostics.ts b/extensions/markdown-language-features/src/languageFeatures/diagnostics.ts index b43a11f9784..f54c136ad1a 100644 --- a/extensions/markdown-language-features/src/languageFeatures/diagnostics.ts +++ b/extensions/markdown-language-features/src/languageFeatures/diagnostics.ts @@ -4,10 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; -import * as nls from 'vscode-nls'; import { CommandManager } from '../commandManager'; -const localize = nls.loadMessageBundle(); // Copied from markdown language service export enum DiagnosticCode { @@ -55,7 +53,7 @@ class AddToIgnoreLinksQuickFixProvider implements vscode.CodeActionProvider { const hrefText = (diagnostic as any).data?.hrefText; if (hrefText) { const fix = new vscode.CodeAction( - localize('ignoreLinksQuickFix.title', "Exclude '{0}' from link validation.", hrefText), + vscode.l10n.t("Exclude '{0}' from link validation.", hrefText), vscode.CodeActionKind.QuickFix); fix.command = { diff --git a/extensions/markdown-language-features/src/languageFeatures/fileReferences.ts b/extensions/markdown-language-features/src/languageFeatures/fileReferences.ts index 83f44c8837f..2f2af15df08 100644 --- a/extensions/markdown-language-features/src/languageFeatures/fileReferences.ts +++ b/extensions/markdown-language-features/src/languageFeatures/fileReferences.ts @@ -5,12 +5,9 @@ import * as vscode from 'vscode'; import type * as lsp from 'vscode-languageserver-types'; -import * as nls from 'vscode-nls'; import { MdLanguageClient } from '../client/client'; import { Command, CommandManager } from '../commandManager'; -const localize = nls.loadMessageBundle(); - export class FindFileReferencesCommand implements Command { @@ -23,13 +20,13 @@ export class FindFileReferencesCommand implements Command { public async execute(resource?: vscode.Uri) { resource ??= vscode.window.activeTextEditor?.document.uri; if (!resource) { - vscode.window.showErrorMessage(localize('error.noResource', "Find file references failed. No resource provided.")); + vscode.window.showErrorMessage(vscode.l10n.t("Find file references failed. No resource provided.")); return; } await vscode.window.withProgress({ location: vscode.ProgressLocation.Window, - title: localize('progress.title', "Finding file references") + title: vscode.l10n.t("Finding file references") }, async (_progress, token) => { const locations = (await this._client.getReferencesToFileInWorkspace(resource!, token)).map(loc => { return new vscode.Location(vscode.Uri.parse(loc.uri), convertRange(loc.range)); diff --git a/extensions/markdown-language-features/src/languageFeatures/linkUpdater.ts b/extensions/markdown-language-features/src/languageFeatures/linkUpdater.ts index ae59e77af33..5d2cf053eb4 100644 --- a/extensions/markdown-language-features/src/languageFeatures/linkUpdater.ts +++ b/extensions/markdown-language-features/src/languageFeatures/linkUpdater.ts @@ -7,14 +7,12 @@ import * as path from 'path'; import * as picomatch from 'picomatch'; import * as vscode from 'vscode'; import { TextDocumentEdit } from 'vscode-languageclient'; -import * as nls from 'vscode-nls'; import { MdLanguageClient } from '../client/client'; import { Delayer } from '../util/async'; import { noopToken } from '../util/cancellation'; import { Disposable } from '../util/dispose'; import { convertRange } from './fileReferences'; -const localize = nls.loadMessageBundle(); const settingNames = Object.freeze({ enabled: 'updateLinksOnFileMove.enabled', @@ -54,7 +52,7 @@ class UpdateLinksOnFileRenameHandler extends Disposable { this._delayer.trigger(() => { vscode.window.withProgress({ location: vscode.ProgressLocation.Window, - title: localize('renameProgress.title', "Checking for Markdown links to update") + title: vscode.l10n.t("Checking for Markdown links to update") }, () => this._flushRenames()); }); } @@ -121,26 +119,26 @@ class UpdateLinksOnFileRenameHandler extends Disposable { } const rejectItem: vscode.MessageItem = { - title: localize('reject.title', "No"), + title: vscode.l10n.t("No"), isCloseAffordance: true, }; const acceptItem: vscode.MessageItem = { - title: localize('accept.title', "Yes"), + title: vscode.l10n.t("Yes"), }; const alwaysItem: vscode.MessageItem = { - title: localize('always.title', "Always"), + title: vscode.l10n.t("Always"), }; const neverItem: vscode.MessageItem = { - title: localize('never.title', "Never"), + title: vscode.l10n.t("Never"), }; const choice = await vscode.window.showInformationMessage( newResources.length === 1 - ? localize('prompt', "Update Markdown links for '{0}'?", path.basename(newResources[0].fsPath)) - : this._getConfirmMessage(localize('promptMoreThanOne', "Update Markdown links for the following {0} files?", newResources.length), newResources), { + ? vscode.l10n.t("Update Markdown links for '{0}'?", path.basename(newResources[0].fsPath)) + : this._getConfirmMessage(vscode.l10n.t("Update Markdown links for the following {0} files?", newResources.length), newResources), { modal: true, }, rejectItem, acceptItem, alwaysItem, neverItem); @@ -203,9 +201,9 @@ class UpdateLinksOnFileRenameHandler extends Disposable { if (resourcesToConfirm.length > MAX_CONFIRM_FILES) { if (resourcesToConfirm.length - MAX_CONFIRM_FILES === 1) { - paths.push(localize('moreFile', "...1 additional file not shown")); + paths.push(vscode.l10n.t("...1 additional file not shown")); } else { - paths.push(localize('moreFiles', "...{0} additional files not shown", resourcesToConfirm.length - MAX_CONFIRM_FILES)); + paths.push(vscode.l10n.t("...{0} additional files not shown", resourcesToConfirm.length - MAX_CONFIRM_FILES)); } } diff --git a/extensions/markdown-language-features/src/preview/documentRenderer.ts b/extensions/markdown-language-features/src/preview/documentRenderer.ts index d20dbeb203c..e7b965aa8e4 100644 --- a/extensions/markdown-language-features/src/preview/documentRenderer.ts +++ b/extensions/markdown-language-features/src/preview/documentRenderer.ts @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; -import * as nls from 'vscode-nls'; import * as uri from 'vscode-uri'; import { ILogger } from '../logging'; import { MarkdownItEngine } from '../markdownEngine'; @@ -14,7 +13,6 @@ import { WebviewResourceProvider } from '../util/resources'; import { MarkdownPreviewConfiguration, MarkdownPreviewConfigurationManager } from './previewConfig'; import { ContentSecurityPolicyArbiter, MarkdownPreviewSecurityLevel } from './security'; -const localize = nls.loadMessageBundle(); /** * Strings used inside the markdown preview. @@ -23,17 +21,11 @@ const localize = nls.loadMessageBundle(); * can be localized using our normal localization process. */ const previewStrings = { - cspAlertMessageText: localize( - 'preview.securityMessage.text', - 'Some content has been disabled in this document'), + cspAlertMessageText: vscode.l10n.t("Some content has been disabled in this document"), - cspAlertMessageTitle: localize( - 'preview.securityMessage.title', - 'Potentially unsafe or insecure content has been disabled in the Markdown preview. Change the Markdown preview security setting to allow insecure content or enable scripts'), + cspAlertMessageTitle: vscode.l10n.t("Potentially unsafe or insecure content has been disabled in the Markdown preview. Change the Markdown preview security setting to allow insecure content or enable scripts"), - cspAlertMessageLabel: localize( - 'preview.securityMessage.label', - 'Content Disabled Security Warning') + cspAlertMessageLabel: vscode.l10n.t("Content Disabled Security Warning") }; export interface MarkdownContentProviderOutput { @@ -130,7 +122,7 @@ export class MdDocumentRenderer { public renderFileNotFoundDocument(resource: vscode.Uri): string { const resourcePath = uri.Utils.basename(resource); - const body = localize('preview.notFound', '{0} cannot be found', resourcePath); + const body = vscode.l10n.t('{0} cannot be found', resourcePath); return ` diff --git a/extensions/markdown-language-features/src/preview/preview.ts b/extensions/markdown-language-features/src/preview/preview.ts index 24cdc05943f..3d04c6db309 100644 --- a/extensions/markdown-language-features/src/preview/preview.ts +++ b/extensions/markdown-language-features/src/preview/preview.ts @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; -import * as nls from 'vscode-nls'; import * as uri from 'vscode-uri'; import { ILogger } from '../logging'; import { MarkdownContributionProvider } from '../markdownExtensions'; @@ -18,7 +17,6 @@ import { MarkdownPreviewConfigurationManager } from './previewConfig'; import { scrollEditorToLine, StartingScrollFragment, StartingScrollLine, StartingScrollLocation } from './scrolling'; import { getVisibleLine, LastScrollLocation, TopmostLineMonitor } from './topmostLineMonitor'; -const localize = nls.loadMessageBundle(); interface WebviewMessage { readonly source: string; @@ -192,9 +190,7 @@ class MarkdownPreview extends Disposable implements WebviewResourceProvider { case 'previewStyleLoadError': vscode.window.showWarningMessage( - localize('onPreviewStyleLoadError', - "Could not load 'markdown.styles': {0}", - e.body.unloadedStyles.join(', '))); + vscode.l10n.t("Could not load 'markdown.styles': {0}", e.body.unloadedStyles.join(', '))); break; } })); @@ -372,7 +368,7 @@ class MarkdownPreview extends Disposable implements WebviewResourceProvider { .then((editor) => { revealLineInEditor(editor); }, () => { - vscode.window.showErrorMessage(localize('preview.clickOpenFailed', 'Could not open {0}', this._resource.toString())); + vscode.window.showErrorMessage(vscode.l10n.t('Could not open {0}', this._resource.toString())); }); } @@ -773,8 +769,8 @@ export class DynamicMarkdownPreview extends Disposable implements IManagedMarkdo private static _getPreviewTitle(resource: vscode.Uri, locked: boolean): string { const resourceLabel = uri.Utils.basename(resource); return locked - ? localize('lockedPreviewTitle', '[Preview] {0}', resourceLabel) - : localize('previewTitle', 'Preview {0}', resourceLabel); + ? vscode.l10n.t('[Preview] {0}', resourceLabel) + : vscode.l10n.t('Preview {0}', resourceLabel); } public get position(): vscode.ViewColumn | undefined { diff --git a/extensions/markdown-language-features/src/preview/previewManager.ts b/extensions/markdown-language-features/src/preview/previewManager.ts index 89873110eb1..dc4d311a96d 100644 --- a/extensions/markdown-language-features/src/preview/previewManager.ts +++ b/extensions/markdown-language-features/src/preview/previewManager.ts @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; -import * as nls from 'vscode-nls'; import { ILogger } from '../logging'; import { MarkdownContributionProvider } from '../markdownExtensions'; import { Disposable, disposeAll } from '../util/dispose'; @@ -16,8 +15,6 @@ import { MarkdownPreviewConfigurationManager } from './previewConfig'; import { scrollEditorToLine, StartingScrollFragment } from './scrolling'; import { TopmostLineMonitor } from './topmostLineMonitor'; -const localize = nls.loadMessageBundle(); - export interface DynamicPreviewSettings { readonly resourceColumn: vscode.ViewColumn; @@ -216,7 +213,7 @@ export class MarkdownPreviewManager extends Disposable implements vscode.Webview -

${localize('preview.restoreError', "An unexpected error occurred while restoring the Markdown preview.")}

+

${vscode.l10n.t("An unexpected error occurred while restoring the Markdown preview.")}

`; } diff --git a/extensions/markdown-language-features/src/preview/security.ts b/extensions/markdown-language-features/src/preview/security.ts index 539ec55bc40..0ba1a9f61f0 100644 --- a/extensions/markdown-language-features/src/preview/security.ts +++ b/extensions/markdown-language-features/src/preview/security.ts @@ -4,13 +4,9 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; -import * as nls from 'vscode-nls'; import { MarkdownPreviewManager } from './previewManager'; - -const localize = nls.loadMessageBundle(); - export const enum MarkdownPreviewSecurityLevel { Strict = 0, AllowInsecureContent = 1, @@ -108,35 +104,33 @@ export class PreviewSecuritySelector { [ { type: MarkdownPreviewSecurityLevel.Strict, - label: markActiveWhen(currentSecurityLevel === MarkdownPreviewSecurityLevel.Strict) + localize('strict.title', 'Strict'), - description: localize('strict.description', 'Only load secure content'), + label: markActiveWhen(currentSecurityLevel === MarkdownPreviewSecurityLevel.Strict) + vscode.l10n.t("Strict"), + description: vscode.l10n.t("Only load secure content"), }, { type: MarkdownPreviewSecurityLevel.AllowInsecureLocalContent, - label: markActiveWhen(currentSecurityLevel === MarkdownPreviewSecurityLevel.AllowInsecureLocalContent) + localize('insecureLocalContent.title', 'Allow insecure local content'), - description: localize('insecureLocalContent.description', 'Enable loading content over http served from localhost'), + label: markActiveWhen(currentSecurityLevel === MarkdownPreviewSecurityLevel.AllowInsecureLocalContent) + vscode.l10n.t("Allow insecure local content"), + description: vscode.l10n.t("Enable loading content over http served from localhost"), }, { type: MarkdownPreviewSecurityLevel.AllowInsecureContent, - label: markActiveWhen(currentSecurityLevel === MarkdownPreviewSecurityLevel.AllowInsecureContent) + localize('insecureContent.title', 'Allow insecure content'), - description: localize('insecureContent.description', 'Enable loading content over http'), + label: markActiveWhen(currentSecurityLevel === MarkdownPreviewSecurityLevel.AllowInsecureContent) + vscode.l10n.t("Allow insecure content"), + description: vscode.l10n.t("Enable loading content over http"), }, { type: MarkdownPreviewSecurityLevel.AllowScriptsAndAllContent, - label: markActiveWhen(currentSecurityLevel === MarkdownPreviewSecurityLevel.AllowScriptsAndAllContent) + localize('disable.title', 'Disable'), - description: localize('disable.description', 'Allow all content and script execution. Not recommended'), + label: markActiveWhen(currentSecurityLevel === MarkdownPreviewSecurityLevel.AllowScriptsAndAllContent) + vscode.l10n.t("Disable"), + description: vscode.l10n.t("Allow all content and script execution. Not recommended"), }, { type: 'moreinfo', - label: localize('moreInfo.title', 'More Information'), + label: vscode.l10n.t("More Information"), description: '' }, { type: 'toggle', label: this._cspArbiter.shouldDisableSecurityWarnings() - ? localize('enableSecurityWarning.title', "Enable preview security warnings in this workspace") - : localize('disableSecurityWarning.title', "Disable preview security warning in this workspace"), - description: localize('toggleSecurityWarning.description', 'Does not affect the content security level') + ? vscode.l10n.t("Enable preview security warnings in this workspace") + : vscode.l10n.t("Disable preview security warning in this workspace"), + description: vscode.l10n.t("Does not affect the content security level") }, ], { - placeHolder: localize( - 'preview.showPreviewSecuritySelector.title', - 'Select security settings for Markdown previews in this workspace'), + placeHolder: vscode.l10n.t("Select security settings for Markdown previews in this workspace"), }); if (!selection) { return; diff --git a/extensions/markdown-language-features/yarn.lock b/extensions/markdown-language-features/yarn.lock index 6bd778ed899..33734b3ac3e 100644 --- a/extensions/markdown-language-features/yarn.lock +++ b/extensions/markdown-language-features/yarn.lock @@ -258,11 +258,6 @@ vscode-nls@^5.0.1: resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-5.0.1.tgz#ba23fc4d4420d25e7f886c8e83cbdcec47aa48b2" integrity sha512-hHQV6iig+M21lTdItKPkJAaWrxALQb/nqpVffakO4knJOh3DrU2SXOMzUzNgo1eADPzu3qSsJY1weCzvR52q9A== -vscode-nls@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-5.2.0.tgz#3cb6893dd9bd695244d8a024bdf746eea665cc3f" - integrity sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng== - vscode-uri@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-3.0.3.tgz#a95c1ce2e6f41b7549f86279d19f47951e4f4d84" From 0bd1531e0051f4d0c3d27ce052c253c581ce0570 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Fri, 4 Nov 2022 01:50:18 -0700 Subject: [PATCH 105/185] Adopt l10n for ts extension (#165450) For #164438 Also refines the eslint rule from #165448 --- .../typescript-language-features/package.json | 1 - .../codeLens/baseCodeLensProvider.ts | 4 +- .../codeLens/implementationsCodeLens.ts | 6 +-- .../codeLens/referencesCodeLens.ts | 6 +-- .../src/languageFeatures/completions.ts | 18 +++---- .../directiveCommentCompletions.ts | 18 ++----- .../src/languageFeatures/fileReferences.ts | 12 ++--- .../src/languageFeatures/fixAll.ts | 8 ++-- .../src/languageFeatures/hover.ts | 8 ++-- .../src/languageFeatures/jsDocCompletions.ts | 4 +- .../src/languageFeatures/organizeImports.ts | 12 ++--- .../src/languageFeatures/quickFix.ts | 4 +- .../src/languageFeatures/refactor.ts | 16 +++---- .../src/languageFeatures/rename.ts | 4 +- .../src/languageFeatures/sourceDefinition.ts | 15 +++--- .../src/languageFeatures/tsconfig.ts | 6 +-- .../languageFeatures/updatePathsOnRename.ts | 20 ++++---- .../src/task/taskProvider.ts | 8 ++-- .../src/tsServer/serverProcess.browser.ts | 4 +- .../src/tsServer/serverProcess.electron.ts | 4 +- .../src/tsServer/versionManager.ts | 20 ++++---- .../src/tsServer/versionProvider.electron.ts | 6 +-- .../src/tsServer/versionProvider.ts | 6 +-- .../src/typescriptServiceClient.ts | 47 +++++++------------ .../src/ui/intellisenseStatus.ts | 26 +++++----- .../src/ui/jsNodeWalkthrough.electron.ts | 10 ++-- .../src/ui/versionStatus.ts | 8 ++-- .../src/utils/api.ts | 5 +- .../src/utils/largeProjectStatus.ts | 14 +++--- .../src/utils/logLevelMonitor.ts | 14 ++---- .../src/utils/logger.ts | 4 +- .../src/utils/tsconfig.ts | 20 +++----- .../src/utils/typingsStatus.ts | 9 ++-- .../typescript-language-features/yarn.lock | 5 -- 34 files changed, 136 insertions(+), 236 deletions(-) diff --git a/extensions/typescript-language-features/package.json b/extensions/typescript-language-features/package.json index 1ca2f8692ef..4d851e87908 100644 --- a/extensions/typescript-language-features/package.json +++ b/extensions/typescript-language-features/package.json @@ -37,7 +37,6 @@ "@vscode/extension-telemetry": "0.6.2", "jsonc-parser": "^2.2.1", "semver": "5.5.1", - "vscode-nls": "^5.2.0", "vscode-tas-client": "^0.1.63", "vscode-uri": "^3.0.3" }, diff --git a/extensions/typescript-language-features/src/languageFeatures/codeLens/baseCodeLensProvider.ts b/extensions/typescript-language-features/src/languageFeatures/codeLens/baseCodeLensProvider.ts index 214e6b24f7b..74377b29f74 100644 --- a/extensions/typescript-language-features/src/languageFeatures/codeLens/baseCodeLensProvider.ts +++ b/extensions/typescript-language-features/src/languageFeatures/codeLens/baseCodeLensProvider.ts @@ -4,14 +4,12 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; -import * as nls from 'vscode-nls'; import type * as Proto from '../../protocol'; import { CachedResponse } from '../../tsServer/cachedResponse'; import { ITypeScriptServiceClient } from '../../typescriptService'; import { escapeRegExp } from '../../utils/regexp'; import * as typeConverters from '../../utils/typeConverters'; -const localize = nls.loadMessageBundle(); export class ReferencesCodeLens extends vscode.CodeLens { constructor( @@ -32,7 +30,7 @@ export abstract class TypeScriptBaseCodeLensProvider implements vscode.CodeLensP }; public static readonly errorCommand: vscode.Command = { - title: localize('referenceErrorLabel', 'Could not determine references'), + title: vscode.l10n.t("Could not determine references"), command: '' }; diff --git a/extensions/typescript-language-features/src/languageFeatures/codeLens/implementationsCodeLens.ts b/extensions/typescript-language-features/src/languageFeatures/codeLens/implementationsCodeLens.ts index 37750021597..0941a506ddb 100644 --- a/extensions/typescript-language-features/src/languageFeatures/codeLens/implementationsCodeLens.ts +++ b/extensions/typescript-language-features/src/languageFeatures/codeLens/implementationsCodeLens.ts @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; -import * as nls from 'vscode-nls'; import type * as Proto from '../../protocol'; import * as PConst from '../../protocol.const'; import { CachedResponse } from '../../tsServer/cachedResponse'; @@ -15,7 +14,6 @@ import { LanguageDescription } from '../../utils/languageDescription'; import * as typeConverters from '../../utils/typeConverters'; import { getSymbolRange, ReferencesCodeLens, TypeScriptBaseCodeLensProvider } from './baseCodeLensProvider'; -const localize = nls.loadMessageBundle(); export default class TypeScriptImplementationsCodeLensProvider extends TypeScriptBaseCodeLensProvider { @@ -61,8 +59,8 @@ export default class TypeScriptImplementationsCodeLensProvider extends TypeScrip private getTitle(locations: vscode.Location[]): string { return locations.length === 1 - ? localize('oneImplementationLabel', '1 implementation') - : localize('manyImplementationLabel', '{0} implementations', locations.length); + ? vscode.l10n.t("1 implementation") + : vscode.l10n.t("{0} implementations", locations.length); } protected extractSymbol( diff --git a/extensions/typescript-language-features/src/languageFeatures/codeLens/referencesCodeLens.ts b/extensions/typescript-language-features/src/languageFeatures/codeLens/referencesCodeLens.ts index 8e4f0819b7b..2a89bd6c127 100644 --- a/extensions/typescript-language-features/src/languageFeatures/codeLens/referencesCodeLens.ts +++ b/extensions/typescript-language-features/src/languageFeatures/codeLens/referencesCodeLens.ts @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; -import * as nls from 'vscode-nls'; import type * as Proto from '../../protocol'; import * as PConst from '../../protocol.const'; import { CachedResponse } from '../../tsServer/cachedResponse'; @@ -16,7 +15,6 @@ import { LanguageDescription } from '../../utils/languageDescription'; import * as typeConverters from '../../utils/typeConverters'; import { getSymbolRange, ReferencesCodeLens, TypeScriptBaseCodeLensProvider } from './baseCodeLensProvider'; -const localize = nls.loadMessageBundle(); export class TypeScriptReferencesCodeLensProvider extends TypeScriptBaseCodeLensProvider { public constructor( @@ -56,8 +54,8 @@ export class TypeScriptReferencesCodeLensProvider extends TypeScriptBaseCodeLens private getCodeLensLabel(locations: ReadonlyArray): string { return locations.length === 1 - ? localize('oneReferenceLabel', '1 reference') - : localize('manyReferenceLabel', '{0} references', locations.length); + ? vscode.l10n.t("1 reference") + : vscode.l10n.t("{0} references", locations.length); } protected extractSymbol( diff --git a/extensions/typescript-language-features/src/languageFeatures/completions.ts b/extensions/typescript-language-features/src/languageFeatures/completions.ts index 2547b92e044..fa04ed1fa5b 100644 --- a/extensions/typescript-language-features/src/languageFeatures/completions.ts +++ b/extensions/typescript-language-features/src/languageFeatures/completions.ts @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; -import * as nls from 'vscode-nls'; import { Command, CommandManager } from '../commands/commandManager'; import type * as Proto from '../protocol'; import * as PConst from '../protocol.const'; @@ -23,7 +22,6 @@ import * as typeConverters from '../utils/typeConverters'; import TypingsStatus from '../utils/typingsStatus'; import FileConfigurationManager from './fileConfigurationManager'; -const localize = nls.loadMessageBundle(); interface DotAccessorContext { readonly range: vscode.Range; @@ -622,7 +620,7 @@ class ApplyCompletionCodeActionCommand implements Command { description: '', action, })), { - placeHolder: localize('selectCodeAction', 'Select code action to apply') + placeHolder: vscode.l10n.t("Select code action to apply") }); if (selection) { @@ -692,12 +690,14 @@ class TypeScriptCompletionItemProvider implements vscode.CompletionItemProvider< if (this.typingsStatus.isAcquiringTypings) { return Promise.reject>({ - label: localize( - { key: 'acquiringTypingsLabel', comment: ['Typings refers to the *.d.ts typings files that power our IntelliSense. It should not be localized'] }, - 'Acquiring typings...'), - detail: localize( - { key: 'acquiringTypingsDetail', comment: ['Typings refers to the *.d.ts typings files that power our IntelliSense. It should not be localized'] }, - 'Acquiring typings definitions for IntelliSense.') + label: vscode.l10n.t({ + message: "Acquiring typings...", + comment: ['Typings refers to the *.d.ts typings files that power our IntelliSense. It should not be localized'], + }), + detail: vscode.l10n.t({ + message: "Acquiring typings definitions for IntelliSense.", + comment: ['Typings refers to the *.d.ts typings files that power our IntelliSense. It should not be localized'], + }) }); } diff --git a/extensions/typescript-language-features/src/languageFeatures/directiveCommentCompletions.ts b/extensions/typescript-language-features/src/languageFeatures/directiveCommentCompletions.ts index 2b0f683e589..f2a5021ae17 100644 --- a/extensions/typescript-language-features/src/languageFeatures/directiveCommentCompletions.ts +++ b/extensions/typescript-language-features/src/languageFeatures/directiveCommentCompletions.ts @@ -4,12 +4,10 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; -import * as nls from 'vscode-nls'; import { ITypeScriptServiceClient } from '../typescriptService'; import API from '../utils/api'; import { DocumentSelector } from '../utils/documentSelector'; -const localize = nls.loadMessageBundle(); interface Directive { readonly value: string; @@ -19,19 +17,13 @@ interface Directive { const tsDirectives: Directive[] = [ { value: '@ts-check', - description: localize( - 'ts-check', - "Enables semantic checking in a JavaScript file. Must be at the top of a file.") + description: vscode.l10n.t("Enables semantic checking in a JavaScript file. Must be at the top of a file.") }, { value: '@ts-nocheck', - description: localize( - 'ts-nocheck', - "Disables semantic checking in a JavaScript file. Must be at the top of a file.") + description: vscode.l10n.t("Disables semantic checking in a JavaScript file. Must be at the top of a file.") }, { value: '@ts-ignore', - description: localize( - 'ts-ignore', - "Suppresses @ts-check errors on the next line of a file.") + description: vscode.l10n.t("Suppresses @ts-check errors on the next line of a file.") } ]; @@ -39,9 +31,7 @@ const tsDirectives390: Directive[] = [ ...tsDirectives, { value: '@ts-expect-error', - description: localize( - 'ts-expect-error', - "Suppresses @ts-check errors on the next line of a file, expecting at least one to exist.") + description: vscode.l10n.t("Suppresses @ts-check errors on the next line of a file, expecting at least one to exist.") } ]; diff --git a/extensions/typescript-language-features/src/languageFeatures/fileReferences.ts b/extensions/typescript-language-features/src/languageFeatures/fileReferences.ts index b9e9db47fe5..fcc2bbcf149 100644 --- a/extensions/typescript-language-features/src/languageFeatures/fileReferences.ts +++ b/extensions/typescript-language-features/src/languageFeatures/fileReferences.ts @@ -4,14 +4,12 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; -import * as nls from 'vscode-nls'; import { Command, CommandManager } from '../commands/commandManager'; import { ITypeScriptServiceClient } from '../typescriptService'; import API from '../utils/api'; import { isSupportedLanguageMode } from '../utils/languageIds'; import * as typeConverters from '../utils/typeConverters'; -const localize = nls.loadMessageBundle(); class FileReferencesCommand implements Command { @@ -26,31 +24,31 @@ class FileReferencesCommand implements Command { public async execute(resource?: vscode.Uri) { if (this.client.apiVersion.lt(FileReferencesCommand.minVersion)) { - vscode.window.showErrorMessage(localize('error.unsupportedVersion', "Find file references failed. Requires TypeScript 4.2+.")); + vscode.window.showErrorMessage(vscode.l10n.t("Find file references failed. Requires TypeScript 4.2+.")); return; } resource ??= vscode.window.activeTextEditor?.document.uri; if (!resource) { - vscode.window.showErrorMessage(localize('error.noResource', "Find file references failed. No resource provided.")); + vscode.window.showErrorMessage(vscode.l10n.t("Find file references failed. No resource provided.")); return; } const document = await vscode.workspace.openTextDocument(resource); if (!isSupportedLanguageMode(document)) { - vscode.window.showErrorMessage(localize('error.unsupportedLanguage', "Find file references failed. Unsupported file type.")); + vscode.window.showErrorMessage(vscode.l10n.t("Find file references failed. Unsupported file type.")); return; } const openedFiledPath = this.client.toOpenedFilePath(document); if (!openedFiledPath) { - vscode.window.showErrorMessage(localize('error.unknownFile', "Find file references failed. Unknown file type.")); + vscode.window.showErrorMessage(vscode.l10n.t("Find file references failed. Unknown file type.")); return; } await vscode.window.withProgress({ location: vscode.ProgressLocation.Window, - title: localize('progress.title', "Finding file references") + title: vscode.l10n.t("Finding file references") }, async (_progress, token) => { const response = await this.client.execute('fileReferences', { diff --git a/extensions/typescript-language-features/src/languageFeatures/fixAll.ts b/extensions/typescript-language-features/src/languageFeatures/fixAll.ts index 9119b5b66ba..1fad8f4eb61 100644 --- a/extensions/typescript-language-features/src/languageFeatures/fixAll.ts +++ b/extensions/typescript-language-features/src/languageFeatures/fixAll.ts @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; -import * as nls from 'vscode-nls'; import type * as Proto from '../protocol'; import { ClientCapability, ITypeScriptServiceClient } from '../typescriptService'; import API from '../utils/api'; @@ -16,7 +15,6 @@ import * as typeConverters from '../utils/typeConverters'; import { DiagnosticsManager } from './diagnostics'; import FileConfigurationManager from './fileConfigurationManager'; -const localize = nls.loadMessageBundle(); interface AutoFix { readonly codes: Set; @@ -133,7 +131,7 @@ class SourceFixAll extends SourceAction { static readonly kind = vscode.CodeActionKind.SourceFixAll.append('ts'); constructor() { - super(localize('autoFix.label', 'Fix all fixable JS/TS issues'), SourceFixAll.kind); + super(vscode.l10n.t("Fix all fixable JS/TS issues"), SourceFixAll.kind); } async build(client: ITypeScriptServiceClient, file: string, diagnostics: readonly vscode.Diagnostic[], token: vscode.CancellationToken): Promise { @@ -155,7 +153,7 @@ class SourceRemoveUnused extends SourceAction { static readonly kind = vscode.CodeActionKind.Source.append('removeUnused').append('ts'); constructor() { - super(localize('autoFix.unused.label', 'Remove all unused code'), SourceRemoveUnused.kind); + super(vscode.l10n.t("Remove all unused code"), SourceRemoveUnused.kind); } async build(client: ITypeScriptServiceClient, file: string, diagnostics: readonly vscode.Diagnostic[], token: vscode.CancellationToken): Promise { @@ -171,7 +169,7 @@ class SourceAddMissingImports extends SourceAction { static readonly kind = vscode.CodeActionKind.Source.append('addMissingImports').append('ts'); constructor() { - super(localize('autoFix.missingImports.label', 'Add all missing imports'), SourceAddMissingImports.kind); + super(vscode.l10n.t("Add all missing imports"), SourceAddMissingImports.kind); } async build(client: ITypeScriptServiceClient, file: string, diagnostics: readonly vscode.Diagnostic[], token: vscode.CancellationToken): Promise { diff --git a/extensions/typescript-language-features/src/languageFeatures/hover.ts b/extensions/typescript-language-features/src/languageFeatures/hover.ts index 362826513bc..89a20128a4b 100644 --- a/extensions/typescript-language-features/src/languageFeatures/hover.ts +++ b/extensions/typescript-language-features/src/languageFeatures/hover.ts @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; -import * as nls from 'vscode-nls'; import type * as Proto from '../protocol'; import { ClientCapability, ITypeScriptServiceClient, ServerType } from '../typescriptService'; import { conditionalRegistration, requireSomeCapability } from '../utils/dependentRegistration'; @@ -13,7 +12,6 @@ import { markdownDocumentation } from '../utils/previewer'; import * as typeConverters from '../utils/typeConverters'; import FileConfigurationManager from './fileConfigurationManager'; -const localize = nls.loadMessageBundle(); class TypeScriptHoverProvider implements vscode.HoverProvider { @@ -61,10 +59,10 @@ class TypeScriptHoverProvider implements vscode.HoverProvider { if (source === ServerType.Syntax && this.client.hasCapabilityForResource(resource, ClientCapability.Semantic)) { displayParts.push( - localize({ - key: 'loadingPrefix', + vscode.l10n.t({ + message: "(loading...)", comment: ['Prefix displayed for hover entries while the server is still loading'] - }, "(loading...)")); + })); } displayParts.push(data.displayString); diff --git a/extensions/typescript-language-features/src/languageFeatures/jsDocCompletions.ts b/extensions/typescript-language-features/src/languageFeatures/jsDocCompletions.ts index 3c481dcc177..e647e0c0006 100644 --- a/extensions/typescript-language-features/src/languageFeatures/jsDocCompletions.ts +++ b/extensions/typescript-language-features/src/languageFeatures/jsDocCompletions.ts @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; -import * as nls from 'vscode-nls'; import { ITypeScriptServiceClient } from '../typescriptService'; import { DocumentSelector } from '../utils/documentSelector'; import { LanguageDescription } from '../utils/languageDescription'; @@ -12,7 +11,6 @@ import * as typeConverters from '../utils/typeConverters'; import FileConfigurationManager from './fileConfigurationManager'; -const localize = nls.loadMessageBundle(); const defaultJsDoc = new vscode.SnippetString(`/**\n * $0\n */`); @@ -22,7 +20,7 @@ class JsDocCompletionItem extends vscode.CompletionItem { public readonly position: vscode.Position ) { super('/** */', vscode.CompletionItemKind.Text); - this.detail = localize('typescript.jsDocCompletionItem.documentation', 'JSDoc comment'); + this.detail = vscode.l10n.t("JSDoc comment"); this.sortText = '\0'; const line = document.lineAt(position.line).text; diff --git a/extensions/typescript-language-features/src/languageFeatures/organizeImports.ts b/extensions/typescript-language-features/src/languageFeatures/organizeImports.ts index f0ebaf7fcf1..ca04e5c7353 100644 --- a/extensions/typescript-language-features/src/languageFeatures/organizeImports.ts +++ b/extensions/typescript-language-features/src/languageFeatures/organizeImports.ts @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; -import * as nls from 'vscode-nls'; import { Command, CommandManager } from '../commands/commandManager'; import type * as Proto from '../protocol'; import { OrganizeImportsMode } from '../protocol.const'; @@ -17,7 +16,6 @@ import { TelemetryReporter } from '../utils/telemetry'; import * as typeConverters from '../utils/typeConverters'; import FileConfigurationManager from './fileConfigurationManager'; -const localize = nls.loadMessageBundle(); interface OrganizeImportsCommandMetadata { readonly ids: readonly string[]; @@ -30,7 +28,7 @@ interface OrganizeImportsCommandMetadata { const organizeImportsCommand: OrganizeImportsCommandMetadata = { ids: ['typescript.organizeImports'], minVersion: API.v280, - title: localize('organizeImportsAction.title', "Organize Imports"), + title: vscode.l10n.t("Organize Imports"), kind: vscode.CodeActionKind.SourceOrganizeImports, mode: OrganizeImportsMode.All, }; @@ -38,7 +36,7 @@ const organizeImportsCommand: OrganizeImportsCommandMetadata = { const sortImportsCommand: OrganizeImportsCommandMetadata = { ids: ['typescript.sortImports', 'javascript.sortImports'], minVersion: API.v430, - title: localize('sortImportsAction.title', "Sort Imports"), + title: vscode.l10n.t("Sort Imports"), kind: vscode.CodeActionKind.Source.append('sortImports'), mode: OrganizeImportsMode.SortAndCombine, }; @@ -46,7 +44,7 @@ const sortImportsCommand: OrganizeImportsCommandMetadata = { const removeUnusedImportsCommand: OrganizeImportsCommandMetadata = { ids: ['typescript.removeUnusedImports', 'javascript.removeUnusedImports'], minVersion: API.v490, - title: localize('removeUnusedImportsAction.title', "Remove Unused Imports"), + title: vscode.l10n.t("Remove Unused Imports"), kind: vscode.CodeActionKind.Source.append('removeUnusedImports'), mode: OrganizeImportsMode.RemoveUnused, }; @@ -73,7 +71,7 @@ class OrganizeImportsCommand implements Command { if (!file) { const activeEditor = vscode.window.activeTextEditor; if (!activeEditor) { - vscode.window.showErrorMessage(localize('error.organizeImports.noResource', "Organize Imports failed. No resource provided.")); + vscode.window.showErrorMessage(vscode.l10n.t("Organize Imports failed. No resource provided.")); return; } @@ -81,7 +79,7 @@ class OrganizeImportsCommand implements Command { const document = await vscode.workspace.openTextDocument(resource); const openedFiledPath = this.client.toOpenedFilePath(document); if (!openedFiledPath) { - vscode.window.showErrorMessage(localize('error.organizeImports.unknownFile', "Organize Imports failed. Unknown file type.")); + vscode.window.showErrorMessage(vscode.l10n.t("Organize Imports failed. Unknown file type.")); return; } diff --git a/extensions/typescript-language-features/src/languageFeatures/quickFix.ts b/extensions/typescript-language-features/src/languageFeatures/quickFix.ts index 9ea0780a446..a2391e28e07 100644 --- a/extensions/typescript-language-features/src/languageFeatures/quickFix.ts +++ b/extensions/typescript-language-features/src/languageFeatures/quickFix.ts @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; -import * as nls from 'vscode-nls'; import { Command, CommandManager } from '../commands/commandManager'; import type * as Proto from '../protocol'; import { ClientCapability, ITypeScriptServiceClient } from '../typescriptService'; @@ -21,7 +20,6 @@ import * as typeConverters from '../utils/typeConverters'; import { DiagnosticsManager } from './diagnostics'; import FileConfigurationManager from './fileConfigurationManager'; -const localize = nls.loadMessageBundle(); class ApplyCodeActionCommand implements Command { public static readonly ID = '_typescript.applyCodeActionCommand'; @@ -350,7 +348,7 @@ class TypeScriptQuickFixProvider implements vscode.CodeActionProvider action.kind && Extract_Constant.kind.contains(action.kind))) { const disabledAction = new vscode.CodeAction( - localize('extractConstant.disabled.title', "Extract to constant"), + vscode.l10n.t("Extract to constant"), Extract_Constant.kind); disabledAction.disabled = { - reason: localize('extractConstant.disabled.reason', "The current selection cannot be extracted"), + reason: vscode.l10n.t("The current selection cannot be extracted"), }; disabledAction.isPreferred = true; @@ -454,11 +452,11 @@ class TypeScriptRefactorProvider implements vscode.CodeActionProvider action.kind && Extract_Function.kind.contains(action.kind))) { const disabledAction = new vscode.CodeAction( - localize('extractFunction.disabled.title', "Extract to function"), + vscode.l10n.t("Extract to function"), Extract_Function.kind); disabledAction.disabled = { - reason: localize('extractFunction.disabled.reason', "The current selection cannot be extracted"), + reason: vscode.l10n.t("The current selection cannot be extracted"), }; actions.push(disabledAction); } diff --git a/extensions/typescript-language-features/src/languageFeatures/rename.ts b/extensions/typescript-language-features/src/languageFeatures/rename.ts index e3e1b3c694e..44f064ae583 100644 --- a/extensions/typescript-language-features/src/languageFeatures/rename.ts +++ b/extensions/typescript-language-features/src/languageFeatures/rename.ts @@ -5,7 +5,6 @@ import * as path from 'path'; import * as vscode from 'vscode'; -import * as nls from 'vscode-nls'; import type * as Proto from '../protocol'; import { ClientCapability, ITypeScriptServiceClient, ServerResponse } from '../typescriptService'; import API from '../utils/api'; @@ -14,7 +13,6 @@ import { DocumentSelector } from '../utils/documentSelector'; import * as typeConverters from '../utils/typeConverters'; import FileConfigurationManager from './fileConfigurationManager'; -const localize = nls.loadMessageBundle(); class TypeScriptRenameProvider implements vscode.RenameProvider { public constructor( @@ -65,7 +63,7 @@ class TypeScriptRenameProvider implements vscode.RenameProvider { if (edits) { return edits; } else { - return Promise.reject(localize('fileRenameFail', "An error occurred while renaming file")); + return Promise.reject(vscode.l10n.t("An error occurred while renaming file")); } } diff --git a/extensions/typescript-language-features/src/languageFeatures/sourceDefinition.ts b/extensions/typescript-language-features/src/languageFeatures/sourceDefinition.ts index 527a25ef8b2..b4b431cec18 100644 --- a/extensions/typescript-language-features/src/languageFeatures/sourceDefinition.ts +++ b/extensions/typescript-language-features/src/languageFeatures/sourceDefinition.ts @@ -4,15 +4,12 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; -import * as nls from 'vscode-nls'; import { Command, CommandManager } from '../commands/commandManager'; import { ITypeScriptServiceClient } from '../typescriptService'; import API from '../utils/api'; import { isSupportedLanguageMode } from '../utils/languageIds'; import * as typeConverters from '../utils/typeConverters'; -const localize = nls.loadMessageBundle(); - class SourceDefinitionCommand implements Command { @@ -27,32 +24,32 @@ class SourceDefinitionCommand implements Command { public async execute() { if (this.client.apiVersion.lt(SourceDefinitionCommand.minVersion)) { - vscode.window.showErrorMessage(localize('error.unsupportedVersion', "Go to Source Definition failed. Requires TypeScript 4.7+.")); + vscode.window.showErrorMessage(vscode.l10n.t("Go to Source Definition failed. Requires TypeScript 4.7+.")); return; } const activeEditor = vscode.window.activeTextEditor; if (!activeEditor) { - vscode.window.showErrorMessage(localize('error.noResource', "Go to Source Definition failed. No resource provided.")); + vscode.window.showErrorMessage(vscode.l10n.t("Go to Source Definition failed. No resource provided.")); return; } const resource = activeEditor.document.uri; const document = await vscode.workspace.openTextDocument(resource); if (!isSupportedLanguageMode(document)) { - vscode.window.showErrorMessage(localize('error.unsupportedLanguage', "Go to Source Definition failed. Unsupported file type.")); + vscode.window.showErrorMessage(vscode.l10n.t("Go to Source Definition failed. Unsupported file type.")); return; } const openedFiledPath = this.client.toOpenedFilePath(document); if (!openedFiledPath) { - vscode.window.showErrorMessage(localize('error.unknownFile', "Go to Source Definition failed. Unknown file type.")); + vscode.window.showErrorMessage(vscode.l10n.t("Go to Source Definition failed. Unknown file type.")); return; } await vscode.window.withProgress({ location: vscode.ProgressLocation.Window, - title: localize('progress.title', "Finding source definitions") + title: vscode.l10n.t("Finding source definitions") }, async (_progress, token) => { const position = activeEditor.selection.anchor; @@ -74,7 +71,7 @@ class SourceDefinitionCommand implements Command { } } - vscode.window.showErrorMessage(localize('error.noReferences', "No source definitions found.")); + vscode.window.showErrorMessage(vscode.l10n.t("No source definitions found.")); }); } } diff --git a/extensions/typescript-language-features/src/languageFeatures/tsconfig.ts b/extensions/typescript-language-features/src/languageFeatures/tsconfig.ts index b64ead7ca15..13105e88629 100644 --- a/extensions/typescript-language-features/src/languageFeatures/tsconfig.ts +++ b/extensions/typescript-language-features/src/languageFeatures/tsconfig.ts @@ -6,7 +6,6 @@ import * as jsonc from 'jsonc-parser'; import { basename, dirname, join, posix } from 'path'; import * as vscode from 'vscode'; -import * as nls from 'vscode-nls'; import { Utils } from 'vscode-uri'; import { coalesce } from '../utils/arrays'; import { exists } from '../utils/fs'; @@ -23,7 +22,6 @@ type OpenExtendsLinkCommandArgs = { extendsValue: string; }; -const localize = nls.loadMessageBundle(); class TsconfigLinkProvider implements vscode.DocumentLinkProvider { @@ -62,7 +60,7 @@ class TsconfigLinkProvider implements vscode.DocumentLinkProvider { const link = new vscode.DocumentLink( this.getRange(document, extendsNode), vscode.Uri.parse(`command:${openExtendsLinkCommandId}?${JSON.stringify(args)}`)); - link.tooltip = localize('documentLink.tooltip', 'Follow link'); + link.tooltip = vscode.l10n.t("Follow link"); return link; } @@ -203,7 +201,7 @@ export function register() { vscode.commands.registerCommand(openExtendsLinkCommandId, async ({ resourceUri, extendsValue, }: OpenExtendsLinkCommandArgs) => { const tsconfigPath = await getTsconfigPath(Utils.dirname(resourceUri), extendsValue); if (tsconfigPath === undefined) { - vscode.window.showErrorMessage(localize('openTsconfigExtendsModuleFail', "Failed to resolve {0} as module", extendsValue)); + vscode.window.showErrorMessage(vscode.l10n.t("Failed to resolve {0} as module", extendsValue)); return; } // Will suggest to create a .json variant if it doesn't exist yet (but only for relative paths) diff --git a/extensions/typescript-language-features/src/languageFeatures/updatePathsOnRename.ts b/extensions/typescript-language-features/src/languageFeatures/updatePathsOnRename.ts index 7c6995ec7d5..9a7bcd7bbd6 100644 --- a/extensions/typescript-language-features/src/languageFeatures/updatePathsOnRename.ts +++ b/extensions/typescript-language-features/src/languageFeatures/updatePathsOnRename.ts @@ -5,7 +5,6 @@ import * as path from 'path'; import * as vscode from 'vscode'; -import * as nls from 'vscode-nls'; import type * as Proto from '../protocol'; import { ClientCapability, ITypeScriptServiceClient } from '../typescriptService'; import API from '../utils/api'; @@ -18,7 +17,6 @@ import { doesResourceLookLikeATypeScriptFile } from '../utils/languageDescriptio import * as typeConverters from '../utils/typeConverters'; import FileConfigurationManager from './fileConfigurationManager'; -const localize = nls.loadMessageBundle(); const updateImportsOnFileMoveName = 'updateImportsOnFileMove.enabled'; @@ -87,7 +85,7 @@ class UpdateImportsOnFileRenameHandler extends Disposable { this._delayer.trigger(() => { vscode.window.withProgress({ location: vscode.ProgressLocation.Window, - title: localize('renameProgress.title', "Checking for update of JS/TS imports") + title: vscode.l10n.t("Checking for update of JS/TS imports") }, () => this.flushRenames()); }); })); @@ -148,26 +146,26 @@ class UpdateImportsOnFileRenameHandler extends Disposable { } const rejectItem: vscode.MessageItem = { - title: localize('reject.title', "No"), + title: vscode.l10n.t("No"), isCloseAffordance: true, }; const acceptItem: vscode.MessageItem = { - title: localize('accept.title', "Yes"), + title: vscode.l10n.t("Yes"), }; const alwaysItem: vscode.MessageItem = { - title: localize('always.title', "Always automatically update imports"), + title: vscode.l10n.t("Always automatically update imports"), }; const neverItem: vscode.MessageItem = { - title: localize('never.title', "Never automatically update imports"), + title: vscode.l10n.t("Never automatically update imports"), }; const response = await vscode.window.showInformationMessage( newResources.length === 1 - ? localize('prompt', "Update imports for '{0}'?", path.basename(newResources[0].fsPath)) - : this.getConfirmMessage(localize('promptMoreThanOne', "Update imports for the following {0} files?", newResources.length), newResources), { + ? vscode.l10n.t("Update imports for '{0}'?", path.basename(newResources[0].fsPath)) + : this.getConfirmMessage(vscode.l10n.t("Update imports for the following {0} files?", newResources.length), newResources), { modal: true, }, rejectItem, acceptItem, alwaysItem, neverItem); @@ -261,9 +259,9 @@ class UpdateImportsOnFileRenameHandler extends Disposable { if (resourcesToConfirm.length > MAX_CONFIRM_FILES) { if (resourcesToConfirm.length - MAX_CONFIRM_FILES === 1) { - paths.push(localize('moreFile', "...1 additional file not shown")); + paths.push(vscode.l10n.t("...1 additional file not shown")); } else { - paths.push(localize('moreFiles', "...{0} additional files not shown", resourcesToConfirm.length - MAX_CONFIRM_FILES)); + paths.push(vscode.l10n.t("...{0} additional files not shown", resourcesToConfirm.length - MAX_CONFIRM_FILES)); } } diff --git a/extensions/typescript-language-features/src/task/taskProvider.ts b/extensions/typescript-language-features/src/task/taskProvider.ts index 85484f6d729..624a1ecea79 100644 --- a/extensions/typescript-language-features/src/task/taskProvider.ts +++ b/extensions/typescript-language-features/src/task/taskProvider.ts @@ -6,7 +6,6 @@ import * as jsonc from 'jsonc-parser'; import * as path from 'path'; import * as vscode from 'vscode'; -import * as nls from 'vscode-nls'; import { wait } from '../test/testUtils'; import { ITypeScriptServiceClient, ServerResponse } from '../typescriptService'; import { coalesce } from '../utils/arrays'; @@ -17,7 +16,6 @@ import { Lazy } from '../utils/lazy'; import { isImplicitProjectConfigFile } from '../utils/tsconfig'; import { TSConfig, TsConfigProvider } from './tsconfigProvider'; -const localize = nls.loadMessageBundle(); enum AutoDetect { on = 'on', @@ -74,7 +72,7 @@ class TscTaskProvider extends Disposable implements vscode.TaskProvider { const definition = task.definition; if (/\\tsconfig.*\.json/.test(definition.tsconfig)) { // Warn that the task has the wrong slash type - vscode.window.showWarningMessage(localize('badTsConfig', "TypeScript Task in tasks.json contains \"\\\\\". TypeScript tasks tsconfig must use \"/\"")); + vscode.window.showWarningMessage(vscode.l10n.t("TypeScript Task in tasks.json contains \"\\\\\". TypeScript tasks tsconfig must use \"/\"")); return undefined; } @@ -210,7 +208,7 @@ class TscTaskProvider extends Disposable implements vscode.TaskProvider { const buildTask = new vscode.Task( buildTaskidentifier, workspaceFolder || vscode.TaskScope.Workspace, - localize('buildTscLabel', 'build - {0}', label), + vscode.l10n.t("build - {0}", label), 'tsc', new vscode.ShellExecution(command, args), '$tsc'); @@ -223,7 +221,7 @@ class TscTaskProvider extends Disposable implements vscode.TaskProvider { const watchTask = new vscode.Task( watchTaskidentifier, workspaceFolder || vscode.TaskScope.Workspace, - localize('buildAndWatchTscLabel', 'watch - {0}', label), + vscode.l10n.t("watch - {0}", label), 'tsc', new vscode.ShellExecution(command, [...args, '--watch']), '$tsc-watch'); diff --git a/extensions/typescript-language-features/src/tsServer/serverProcess.browser.ts b/extensions/typescript-language-features/src/tsServer/serverProcess.browser.ts index c4965258677..5fdbbb6d2f7 100644 --- a/extensions/typescript-language-features/src/tsServer/serverProcess.browser.ts +++ b/extensions/typescript-language-features/src/tsServer/serverProcess.browser.ts @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; -import * as nls from 'vscode-nls'; import type * as Proto from '../protocol'; import { TypeScriptServiceConfiguration } from '../utils/configuration'; import { memoize } from '../utils/memoize'; @@ -12,7 +11,6 @@ import { TsServerProcess, TsServerProcessKind } from './server'; import { TypeScriptVersion } from './versionProvider'; -const localize = nls.loadMessageBundle(); declare const Worker: any; declare type Worker = any; @@ -64,7 +62,7 @@ export class WorkerServerProcess implements TsServerProcess { @memoize private get output(): vscode.OutputChannel { - return vscode.window.createOutputChannel(localize('channelName', 'TypeScript Server Log')); + return vscode.window.createOutputChannel(vscode.l10n.t("TypeScript Server Log")); } write(serverRequest: Proto.Request): void { diff --git a/extensions/typescript-language-features/src/tsServer/serverProcess.electron.ts b/extensions/typescript-language-features/src/tsServer/serverProcess.electron.ts index 7bfd43e36e0..45011662589 100644 --- a/extensions/typescript-language-features/src/tsServer/serverProcess.electron.ts +++ b/extensions/typescript-language-features/src/tsServer/serverProcess.electron.ts @@ -8,7 +8,6 @@ import * as fs from 'fs'; import * as path from 'path'; import type { Readable } from 'stream'; import * as vscode from 'vscode'; -import * as nls from 'vscode-nls'; import type * as Proto from '../protocol'; import API from '../utils/api'; import { TypeScriptServiceConfiguration } from '../utils/configuration'; @@ -17,7 +16,6 @@ import { TsServerProcess, TsServerProcessFactory, TsServerProcessKind } from './ import { TypeScriptVersionManager } from './versionManager'; import { TypeScriptVersion } from './versionProvider'; -const localize = nls.loadMessageBundle(); const defaultSize: number = 8192; const contentLength: string = 'Content-Length: '; @@ -259,7 +257,7 @@ export class ElectronServiceProcessFactory implements TsServerProcessFactory { let tsServerPath = version.tsServerPath; if (!fs.existsSync(tsServerPath)) { - vscode.window.showWarningMessage(localize('noServerFound', 'The path {0} doesn\'t point to a valid tsserver install. Falling back to bundled TypeScript version.', tsServerPath)); + vscode.window.showWarningMessage(vscode.l10n.t("The path {0} doesn\'t point to a valid tsserver install. Falling back to bundled TypeScript version.', tsServerPath")); versionManager.reset(); tsServerPath = versionManager.currentVersion.tsServerPath; } diff --git a/extensions/typescript-language-features/src/tsServer/versionManager.ts b/extensions/typescript-language-features/src/tsServer/versionManager.ts index 7b8a3640660..68d44a76890 100644 --- a/extensions/typescript-language-features/src/tsServer/versionManager.ts +++ b/extensions/typescript-language-features/src/tsServer/versionManager.ts @@ -4,13 +4,11 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; -import * as nls from 'vscode-nls'; import { setImmediate } from '../utils/async'; import { TypeScriptServiceConfiguration } from '../utils/configuration'; import { Disposable } from '../utils/dispose'; import { ITypeScriptVersionProvider, TypeScriptVersion } from './versionProvider'; -const localize = nls.loadMessageBundle(); const useWorkspaceTsdkStorageKey = 'typescript.useWorkspaceTsdk'; const suppressPromptWorkspaceTsdkStorageKey = 'typescript.suppressPromptWorkspaceTsdk'; @@ -89,9 +87,7 @@ export class TypeScriptVersionManager extends Disposable { }, LearnMorePickItem, ], { - placeHolder: localize( - 'selectTsVersion', - "Select the TypeScript version used for JavaScript and TypeScript language features"), + placeHolder: vscode.l10n.t("Select the TypeScript version used for JavaScript and TypeScript language features"), }); return selected?.run(); @@ -102,7 +98,7 @@ export class TypeScriptVersionManager extends Disposable { return { label: (!this.useWorkspaceTsdkSetting || !vscode.workspace.isTrusted ? '• ' - : '') + localize('useVSCodeVersionOption', "Use VS Code's Version"), + : '') + vscode.l10n.t("Use VS Code's Version"), description: bundledVersion.displayName, detail: bundledVersion.pathLabel, run: async () => { @@ -117,7 +113,7 @@ export class TypeScriptVersionManager extends Disposable { return { label: (this.useWorkspaceTsdkSetting && vscode.workspace.isTrusted && this.currentVersion.eq(version) ? '• ' - : '') + localize('useWorkspaceVersionOption', "Use Workspace Version"), + : '') + vscode.l10n.t("Use Workspace Version"), description: version.displayName, detail: version.pathLabel, run: async () => { @@ -140,11 +136,11 @@ export class TypeScriptVersionManager extends Disposable { throw new Error('Could not prompt to use workspace TypeScript version because no workspace version is specified'); } - const allowIt = localize('allow', 'Allow'); - const dismissPrompt = localize('dismiss', 'Dismiss'); - const suppressPrompt = localize('suppress prompt', 'Never in this Workspace'); + const allowIt = vscode.l10n.t("Allow"); + const dismissPrompt = vscode.l10n.t("Dismiss"); + const suppressPrompt = vscode.l10n.t("Never in this Workspace"); - const result = await vscode.window.showInformationMessage(localize('promptUseWorkspaceTsdk', 'This workspace contains a TypeScript version. Would you like to use the workspace TypeScript version for TypeScript and JavaScript language features?'), + const result = await vscode.window.showInformationMessage(vscode.l10n.t("This workspace contains a TypeScript version. Would you like to use the workspace TypeScript version for TypeScript and JavaScript language features?"), allowIt, dismissPrompt, suppressPrompt @@ -185,7 +181,7 @@ export class TypeScriptVersionManager extends Disposable { } const LearnMorePickItem: QuickPickItem = { - label: localize('learnMore', "Learn more about managing TypeScript versions"), + label: vscode.l10n.t("Learn more about managing TypeScript versions"), description: '', run: () => { vscode.env.openExternal(vscode.Uri.parse('https://go.microsoft.com/fwlink/?linkid=839919')); diff --git a/extensions/typescript-language-features/src/tsServer/versionProvider.electron.ts b/extensions/typescript-language-features/src/tsServer/versionProvider.electron.ts index ad4f9b9dfe6..dca0fb21f1b 100644 --- a/extensions/typescript-language-features/src/tsServer/versionProvider.electron.ts +++ b/extensions/typescript-language-features/src/tsServer/versionProvider.electron.ts @@ -6,13 +6,11 @@ import * as fs from 'fs'; import * as path from 'path'; import * as vscode from 'vscode'; -import * as nls from 'vscode-nls'; import API from '../utils/api'; import { TypeScriptServiceConfiguration } from '../utils/configuration'; import { RelativeWorkspacePathResolver } from '../utils/relativePathResolver'; import { ITypeScriptVersionProvider, TypeScriptVersion, TypeScriptVersionSource } from './versionProvider'; -const localize = nls.loadMessageBundle(); export class DiskTypeScriptVersionProvider implements ITypeScriptVersionProvider { @@ -70,9 +68,7 @@ export class DiskTypeScriptVersionProvider implements ITypeScriptVersionProvider return version; } - vscode.window.showErrorMessage(localize( - 'noBundledServerFound', - 'VS Code\'s tsserver was deleted by another application such as a misbehaving virus detection tool. Please reinstall VS Code.')); + vscode.window.showErrorMessage(vscode.l10n.t("VS Code\'s tsserver was deleted by another application such as a misbehaving virus detection tool. Please reinstall VS Code.")); throw new Error('Could not find bundled tsserver.js'); } diff --git a/extensions/typescript-language-features/src/tsServer/versionProvider.ts b/extensions/typescript-language-features/src/tsServer/versionProvider.ts index 89fd07d8c1b..bdf08a0e13d 100644 --- a/extensions/typescript-language-features/src/tsServer/versionProvider.ts +++ b/extensions/typescript-language-features/src/tsServer/versionProvider.ts @@ -3,11 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as nls from 'vscode-nls'; +import * as vscode from 'vscode'; import API from '../utils/api'; import { TypeScriptServiceConfiguration } from '../utils/configuration'; -const localize = nls.loadMessageBundle(); export const enum TypeScriptVersionSource { Bundled = 'bundled', @@ -54,8 +53,7 @@ export class TypeScriptVersion { public get displayName(): string { const version = this.apiVersion; - return version ? version.displayName : localize( - 'couldNotLoadTsVersion', 'Could not load the TypeScript version at this path'); + return version ? version.displayName : vscode.l10n.t("Could not load the TypeScript version at this path"); } } diff --git a/extensions/typescript-language-features/src/typescriptServiceClient.ts b/extensions/typescript-language-features/src/typescriptServiceClient.ts index 18a9f864c6c..e0b11ac2173 100644 --- a/extensions/typescript-language-features/src/typescriptServiceClient.ts +++ b/extensions/typescript-language-features/src/typescriptServiceClient.ts @@ -5,7 +5,6 @@ import * as path from 'path'; import * as vscode from 'vscode'; -import * as nls from 'vscode-nls'; import { IExperimentationTelemetryReporter } from './experimentTelemetryReporter'; import { DiagnosticKind, DiagnosticsManager } from './languageFeatures/diagnostics'; import * as Proto from './protocol'; @@ -31,7 +30,6 @@ import { TelemetryProperties, TelemetryReporter, VSCodeTelemetryReporter } from import Tracer from './utils/tracer'; import { inferredProjectCompilerOptions, ProjectType } from './utils/tsconfig'; -const localize = nls.loadMessageBundle(); export interface TsDiagnostics { readonly kind: DiagnosticKind; @@ -372,7 +370,7 @@ export default class TypeScriptServiceClient extends Disposable implements IType let version = this._versionManager.currentVersion; if (!version.isValid) { - vscode.window.showWarningMessage(localize('noServerFound', 'The path {0} doesn\'t point to a valid tsserver install. Falling back to bundled TypeScript version.', version.path)); + vscode.window.showWarningMessage(vscode.l10n.t("The path {0} doesn\'t point to a valid tsserver install. Falling back to bundled TypeScript version.', version.path")); this._versionManager.reset(); version = this._versionManager.currentVersion; @@ -410,7 +408,7 @@ export default class TypeScriptServiceClient extends Disposable implements IType } if (err) { - vscode.window.showErrorMessage(localize('serverExitedWithError', 'TypeScript language server exited with error. Error message is: {0}', err.message || err.name)); + vscode.window.showErrorMessage(vscode.l10n.t("TypeScript language server exited with error. Error message is: {0}", err.message || err.name)); } this.serverState = new ServerState.Errored(err, handle.tsServerLogFile); @@ -483,13 +481,9 @@ export default class TypeScriptServiceClient extends Disposable implements IType public async openTsServerLogFile(): Promise { if (this._configuration.tsServerLogLevel === TsServerLogLevel.Off) { vscode.window.showErrorMessage( - localize( - 'typescript.openTsServerLog.loggingNotEnabled', - 'TS Server logging is off. Please set `typescript.tsserver.log` and restart the TS server to enable logging'), + vscode.l10n.t("TS Server logging is off. Please set `typescript.tsserver.log` and restart the TS server to enable logging"), { - title: localize( - 'typescript.openTsServerLog.enableAndReloadOption', - 'Enable logging and restart TS server'), + title: vscode.l10n.t("Enable logging and restart TS server"), }) .then(selection => { if (selection) { @@ -503,9 +497,7 @@ export default class TypeScriptServiceClient extends Disposable implements IType } if (this.serverState.type !== ServerState.Type.Running || !this.serverState.server.tsServerLogFile) { - vscode.window.showWarningMessage(localize( - 'typescript.openTsServerLog.noLogFile', - 'TS Server has not started logging.')); + vscode.window.showWarningMessage(vscode.l10n.t("TS Server has not started logging.")); return false; } @@ -521,9 +513,7 @@ export default class TypeScriptServiceClient extends Disposable implements IType await vscode.commands.executeCommand('revealFileInOS', vscode.Uri.file(this.serverState.server.tsServerLogFile)); return true; } catch { - vscode.window.showWarningMessage(localize( - 'openTsServerLog.openFileFailedFailed', - 'Could not open TS Server log file')); + vscode.window.showWarningMessage(vscode.l10n.t("Could not open TS Server log file")); return false; } } @@ -588,7 +578,7 @@ export default class TypeScriptServiceClient extends Disposable implements IType const pluginExtensionList = this.pluginManager.plugins.map(plugin => plugin.extension.id).join(', '); const reportIssueItem: vscode.MessageItem = { - title: localize('serverDiedReportIssue', 'Report Issue'), + title: vscode.l10n.t("Report Issue"), }; let prompt: Thenable | undefined = undefined; @@ -600,8 +590,8 @@ export default class TypeScriptServiceClient extends Disposable implements IType this.hasServerFatallyCrashedTooManyTimes = true; prompt = vscode.window.showErrorMessage( this.pluginManager.plugins.length - ? localize('serverDiedImmediatelyWithPlugins', "The JS/TS language service immediately crashed 5 times. The service will not be restarted.\nThis may be caused by a plugin contributed by one of these extensions: {0}", pluginExtensionList) - : localize('serverDiedImmediately', "The JS/TS language service immediately crashed 5 times. The service will not be restarted."), + ? vscode.l10n.t("The JS/TS language service immediately crashed 5 times. The service will not be restarted.\nThis may be caused by a plugin contributed by one of these extensions: {0}", pluginExtensionList) + : vscode.l10n.t("The JS/TS language service immediately crashed 5 times. The service will not be restarted."), reportIssueItem); /* __GDPR__ @@ -618,8 +608,8 @@ export default class TypeScriptServiceClient extends Disposable implements IType if (!this._isPromptingAfterCrash) { prompt = vscode.window.showWarningMessage( this.pluginManager.plugins.length - ? localize('serverDiedFiveTimesWithPlugins', "The JS/TS language service crashed 5 times in the last 5 Minutes.\nThis may be caused by a plugin contributed by one of these extensions: {0}", pluginExtensionList) - : localize('serverDiedFiveTimes', "The JS/TS language service crashed 5 times in the last 5 Minutes."), + ? vscode.l10n.t("The JS/TS language service crashed 5 times in the last 5 Minutes.\nThis may be caused by a plugin contributed by one of these extensions: {0}", pluginExtensionList) + : vscode.l10n.t("The JS/TS language service crashed 5 times in the last 5 Minutes."), reportIssueItem); } } @@ -629,8 +619,8 @@ export default class TypeScriptServiceClient extends Disposable implements IType if (!this._isPromptingAfterCrash) { prompt = vscode.window.showWarningMessage( this.pluginManager.plugins.length - ? localize('serverDiedOnceWithPlugins', "The JS/TS language service crashed.\nThis may be caused by a plugin contributed by one of these extensions: {0}", pluginExtensionList) - : localize('serverDiedOnce', "The JS/TS language service crashed."), + ? vscode.l10n.t("The JS/TS language service crashed.\nThis may be caused by a plugin contributed by one of these extensions: {0}", pluginExtensionList) + : vscode.l10n.t("The JS/TS language service crashed."), reportIssueItem); } } @@ -647,13 +637,12 @@ export default class TypeScriptServiceClient extends Disposable implements IType if (minModernTsVersion && this.apiVersion.lt(minModernTsVersion)) { vscode.window.showWarningMessage( - localize('usingOldTsVersion.title', 'Please update your TypeScript version'), + vscode.l10n.t("Please update your TypeScript version"), { modal: true, - detail: localize( - 'usingOldTsVersion.detail', - 'The workspace is using an old version of TypeScript ({0}).\n\nBefore reporting an issue, please update the workspace to use the latest stable TypeScript release to make sure the bug has not already been fixed.', - previousState.type === ServerState.Type.Errored && previousState.error instanceof TypeScriptServerError ? previousState.error.version.apiVersion?.displayName : undefined), + detail: vscode.l10n.t( + "The workspace is using an old version of TypeScript ({0}).\n\nBefore reporting an issue, please update the workspace to use the latest stable TypeScript release to make sure the bug has not already been fixed.", + (previousState.type === ServerState.Type.Errored && previousState.error instanceof TypeScriptServerError ? previousState.error.version.apiVersion?.displayName : undefined) + ''), useCustom: true }); } else { @@ -1113,7 +1102,7 @@ class ServerInitializingIndicator extends Disposable { vscode.window.withProgress({ location: vscode.ProgressLocation.Window, - title: localize('serverLoading.progress', "Initializing JS/TS language features"), + title: vscode.l10n.t("Initializing JS/TS language features"), }, () => new Promise(resolve => { this._task = { project: projectName, resolve }; })); diff --git a/extensions/typescript-language-features/src/ui/intellisenseStatus.ts b/extensions/typescript-language-features/src/ui/intellisenseStatus.ts index 3dfe8187dd1..0fee1f00f68 100644 --- a/extensions/typescript-language-features/src/ui/intellisenseStatus.ts +++ b/extensions/typescript-language-features/src/ui/intellisenseStatus.ts @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; -import * as nls from 'vscode-nls'; import { CommandManager } from '../commands/commandManager'; import { ClientCapability, ITypeScriptServiceClient } from '../typescriptService'; import { ActiveJsTsEditorTracker } from '../utils/activeJsTsEditorTracker'; @@ -12,7 +11,6 @@ import { Disposable } from '../utils/dispose'; import { isSupportedLanguageMode, isTypeScriptDocument, jsTsLanguageModes } from '../utils/languageIds'; import { isImplicitProjectConfigFile, openOrCreateConfig, openProjectConfigForFile, openProjectConfigOrPromptToCreate, ProjectType } from '../utils/tsconfig'; -const localize = nls.loadMessageBundle(); namespace IntellisenseState { export const enum Type { None, Pending, Resolved, SyntaxOnly } @@ -148,7 +146,7 @@ export class IntellisenseStatus extends Disposable { case IntellisenseState.Type.Pending: { const statusItem = this.ensureStatusItem(); statusItem.severity = vscode.LanguageStatusSeverity.Information; - statusItem.text = localize('pending.detail', 'Loading IntelliSense status'); + statusItem.text = vscode.l10n.t("Loading IntelliSense status"); statusItem.detail = undefined; statusItem.command = undefined; statusItem.busy = true; @@ -156,16 +154,16 @@ export class IntellisenseStatus extends Disposable { } case IntellisenseState.Type.Resolved: { const noConfigFileText = this._state.projectType === ProjectType.TypeScript - ? localize('resolved.detail.noTsConfig', "No tsconfig") - : localize('resolved.detail.noJsConfig', "No jsconfig"); + ? vscode.l10n.t("No tsconfig") + : vscode.l10n.t("No jsconfig"); const rootPath = this._client.getWorkspaceRootForResource(this._state.resource); if (!rootPath) { if (this._statusItem) { this._statusItem.text = noConfigFileText; this._statusItem.detail = !vscode.workspace.workspaceFolders - ? localize('resolved.detail.noOpenedFolders', 'No opened folders') - : localize('resolved.detail.notInOpenedFolder', 'File is not part opened folders'); + ? vscode.l10n.t("No opened folders") + : vscode.l10n.t("File is not part opened folders"); this._statusItem.busy = false; } return; @@ -182,8 +180,8 @@ export class IntellisenseStatus extends Disposable { statusItem.command = { command: this.createConfigCommandId, title: this._state.projectType === ProjectType.TypeScript - ? localize('resolved.command.title.createTsconfig', "Create tsconfig") - : localize('resolved.command.title.createJsconfig', "Create jsconfig"), + ? vscode.l10n.t("Create tsconfig") + : vscode.l10n.t("Create jsconfig"), arguments: [rootPath], }; } else { @@ -191,7 +189,7 @@ export class IntellisenseStatus extends Disposable { statusItem.detail = undefined; statusItem.command = { command: this.openOpenConfigCommandId, - title: localize('resolved.command.title.open', "Open config file"), + title: vscode.l10n.t("Open config file"), arguments: [rootPath], }; } @@ -200,11 +198,11 @@ export class IntellisenseStatus extends Disposable { case IntellisenseState.Type.SyntaxOnly: { const statusItem = this.ensureStatusItem(); statusItem.severity = vscode.LanguageStatusSeverity.Warning; - statusItem.text = localize('syntaxOnly.text', 'Partial Mode'); - statusItem.detail = localize('syntaxOnly.detail', 'Project Wide IntelliSense not available'); + statusItem.text = vscode.l10n.t("Partial Mode"); + statusItem.detail = vscode.l10n.t("Project Wide IntelliSense not available"); statusItem.busy = false; statusItem.command = { - title: localize('syntaxOnly.command.title.learnMore', "Learn More"), + title: vscode.l10n.t("Learn More"), command: 'vscode.open', arguments: [ vscode.Uri.parse('https://aka.ms/vscode/jsts/partial-mode'), @@ -218,7 +216,7 @@ export class IntellisenseStatus extends Disposable { private ensureStatusItem(): vscode.LanguageStatusItem { if (!this._statusItem) { this._statusItem = vscode.languages.createLanguageStatusItem('typescript.projectStatus', jsTsLanguageModes); - this._statusItem.name = localize('statusItem.name', "JS/TS IntelliSense Status"); + this._statusItem.name = vscode.l10n.t("JS/TS IntelliSense Status"); } return this._statusItem; } diff --git a/extensions/typescript-language-features/src/ui/jsNodeWalkthrough.electron.ts b/extensions/typescript-language-features/src/ui/jsNodeWalkthrough.electron.ts index 7f31bf3272a..854c2ff3c33 100644 --- a/extensions/typescript-language-features/src/ui/jsNodeWalkthrough.electron.ts +++ b/extensions/typescript-language-features/src/ui/jsNodeWalkthrough.electron.ts @@ -4,13 +4,11 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; -import * as nls from 'vscode-nls'; import * as cp from 'child_process'; import { Disposable } from '../utils/dispose'; import { CommandManager } from '../commands/commandManager'; -const localize = nls.loadMessageBundle(); export async function nodeWasResolvable(): Promise { let execStr: string; @@ -88,12 +86,12 @@ async function createNewJSFile(walkthroughState: JsWalkthroughState) { async function debugJsFile(walkthroughState: JsWalkthroughState) { const hasNode = await nodeWasResolvable(); if (!hasNode) { - const reloadResponse = localize('reloadWindowForNode', 'Reload VS Code'); - const debugAnywayResponse = localize('nodeNotFoundDebugAnyway', 'Try Debugging Anyway'); - const dismissResponse = localize('nodeNotFoundDismissDialog', 'Dismiss'); + const reloadResponse = vscode.l10n.t("Reload VS Code"); + const debugAnywayResponse = vscode.l10n.t("Try Debugging Anyway"); + const dismissResponse = vscode.l10n.t("Dismiss"); const response = await vscode.window.showErrorMessage( // The message - localize('noNodeInstallFound', 'We couldn\'t find Node.js on this computer. If you just installed it, you might need to reload VS Code.'), + vscode.l10n.t("We couldn\'t find Node.js on this computer. If you just installed it, you might need to reload VS Code."), // The options reloadResponse, debugAnywayResponse, diff --git a/extensions/typescript-language-features/src/ui/versionStatus.ts b/extensions/typescript-language-features/src/ui/versionStatus.ts index d577e22b194..3e1629d8f1f 100644 --- a/extensions/typescript-language-features/src/ui/versionStatus.ts +++ b/extensions/typescript-language-features/src/ui/versionStatus.ts @@ -4,14 +4,12 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; -import * as nls from 'vscode-nls'; import { SelectTypeScriptVersionCommand } from '../commands/selectTypeScriptVersion'; import { TypeScriptVersion } from '../tsServer/versionProvider'; import { ITypeScriptServiceClient } from '../typescriptService'; import { Disposable } from '../utils/dispose'; import { jsTsLanguageModes } from '../utils/languageIds'; -const localize = nls.loadMessageBundle(); export class VersionStatus extends Disposable { @@ -24,8 +22,8 @@ export class VersionStatus extends Disposable { this._statusItem = this._register(vscode.languages.createLanguageStatusItem('typescript.version', jsTsLanguageModes)); - this._statusItem.name = localize('versionStatus.name', "TypeScript Version"); - this._statusItem.detail = localize('versionStatus.detail', "TypeScript Version"); + this._statusItem.name = vscode.l10n.t("TypeScript Version"); + this._statusItem.detail = vscode.l10n.t("TypeScript Version"); this._register(this._client.onTsServerStarted(({ version }) => this.onDidChangeTypeScriptVersion(version))); } @@ -34,7 +32,7 @@ export class VersionStatus extends Disposable { this._statusItem.text = version.displayName; this._statusItem.command = { command: SelectTypeScriptVersionCommand.id, - title: localize('versionStatus.command', "Select Version"), + title: vscode.l10n.t("Select Version"), tooltip: version.path }; } diff --git a/extensions/typescript-language-features/src/utils/api.ts b/extensions/typescript-language-features/src/utils/api.ts index 4af828ed45a..fd519013f29 100644 --- a/extensions/typescript-language-features/src/utils/api.ts +++ b/extensions/typescript-language-features/src/utils/api.ts @@ -4,9 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import * as semver from 'semver'; -import * as nls from 'vscode-nls'; +import * as vscode from 'vscode'; -const localize = nls.loadMessageBundle(); export default class API { public static fromSimpleString(value: string): API { @@ -46,7 +45,7 @@ export default class API { public static fromVersionString(versionString: string): API { let version = semver.valid(versionString); if (!version) { - return new API(localize('invalidVersion', 'invalid version'), '1.0.0', '1.0.0'); + return new API(vscode.l10n.t("invalid version"), '1.0.0', '1.0.0'); } // Cut off any prerelease tag since we sometimes consume those on purpose. diff --git a/extensions/typescript-language-features/src/utils/largeProjectStatus.ts b/extensions/typescript-language-features/src/utils/largeProjectStatus.ts index f6bdbf3721c..8dacf80dab2 100644 --- a/extensions/typescript-language-features/src/utils/largeProjectStatus.ts +++ b/extensions/typescript-language-features/src/utils/largeProjectStatus.ts @@ -4,12 +4,10 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; -import { loadMessageBundle } from 'vscode-nls'; import { ITypeScriptServiceClient } from '../typescriptService'; import { TelemetryReporter } from './telemetry'; import { isImplicitProjectConfigFile, openOrCreateConfig, ProjectType } from './tsconfig'; -const localize = loadMessageBundle(); interface Hint { message: string; @@ -24,7 +22,7 @@ class ExcludeHintItem { private readonly telemetryReporter: TelemetryReporter ) { this._item = vscode.window.createStatusBarItem('status.typescript.exclude', vscode.StatusBarAlignment.Right, 98 /* to the right of typescript version status (99) */); - this._item.name = localize('statusExclude', "TypeScript: Configure Excludes"); + this._item.name = vscode.l10n.t("TypeScript: Configure Excludes"); this._item.command = 'js.projectStatus.command'; } @@ -39,12 +37,12 @@ class ExcludeHintItem { public show(largeRoots?: string) { this._currentHint = { message: largeRoots - ? localize('hintExclude', "To enable project-wide JavaScript/TypeScript language features, exclude folders with many files, like: {0}", largeRoots) - : localize('hintExclude.generic', "To enable project-wide JavaScript/TypeScript language features, exclude large folders with source files that you do not work on.") + ? vscode.l10n.t("To enable project-wide JavaScript/TypeScript language features, exclude folders with many files, like: {0}", largeRoots) + : vscode.l10n.t("To enable project-wide JavaScript/TypeScript language features, exclude large folders with source files that you do not work on.") }; this._item.tooltip = this._currentHint.message; - this._item.text = localize('large.label', "Configure Excludes"); - this._item.tooltip = localize('hintExclude.tooltip', "To enable project-wide JavaScript/TypeScript language features, exclude large folders with source files that you do not work on."); + this._item.text = vscode.l10n.t("Configure Excludes"); + this._item.tooltip = vscode.l10n.t("To enable project-wide JavaScript/TypeScript language features, exclude large folders with source files that you do not work on."); this._item.color = '#A5DF3B'; this._item.show(); /* __GDPR__ @@ -76,7 +74,7 @@ function createLargeProjectMonitorFromTypeScript(item: ExcludeHintItem, client: item.configFileName = configFileName; vscode.window.showWarningMessage(item.getCurrentHint().message, { - title: localize('large.label', "Configure Excludes"), + title: vscode.l10n.t("Configure Excludes"), index: 0 }).then(selected => { if (selected && selected.index === 0) { diff --git a/extensions/typescript-language-features/src/utils/logLevelMonitor.ts b/extensions/typescript-language-features/src/utils/logLevelMonitor.ts index 92a48be4cfd..f1140567d99 100644 --- a/extensions/typescript-language-features/src/utils/logLevelMonitor.ts +++ b/extensions/typescript-language-features/src/utils/logLevelMonitor.ts @@ -4,11 +4,9 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; -import * as nls from 'vscode-nls'; import { TsServerLogLevel } from './configuration'; import { Disposable } from './dispose'; -const localize = nls.loadMessageBundle(); export class LogLevelMonitor extends Disposable { @@ -78,19 +76,13 @@ export class LogLevelMonitor extends Disposable { } vscode.window.showInformationMessage( - localize( - 'typescript.extendedLogging.isEnabled', - "TS Server logging is currently enabled which may impact performance."), + vscode.l10n.t("TS Server logging is currently enabled which may impact performance."), { - title: localize( - 'typescript.extendedLogging.disableLogging', - "Disable logging"), + title: vscode.l10n.t("Disable logging"), choice: Choice.DisableLogging }, { - title: localize( - 'typescript.extendedLogging.doNotShowAgain', - "Don't show again"), + title: vscode.l10n.t("Don't show again"), choice: Choice.DoNotShowAgain }) .then(selection => { diff --git a/extensions/typescript-language-features/src/utils/logger.ts b/extensions/typescript-language-features/src/utils/logger.ts index 6afb44136d9..5bab72554c3 100644 --- a/extensions/typescript-language-features/src/utils/logger.ts +++ b/extensions/typescript-language-features/src/utils/logger.ts @@ -4,10 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; -import * as nls from 'vscode-nls'; import { memoize } from './memoize'; -const localize = nls.loadMessageBundle(); type LogLevel = 'Trace' | 'Info' | 'Error'; @@ -15,7 +13,7 @@ export class Logger { @memoize private get output(): vscode.OutputChannel { - return vscode.window.createOutputChannel(localize('channelName', 'TypeScript')); + return vscode.window.createOutputChannel('TypeScript'); } private data2String(data: any): string { diff --git a/extensions/typescript-language-features/src/utils/tsconfig.ts b/extensions/typescript-language-features/src/utils/tsconfig.ts index 1c71d659126..609ae74ba98 100644 --- a/extensions/typescript-language-features/src/utils/tsconfig.ts +++ b/extensions/typescript-language-features/src/utils/tsconfig.ts @@ -5,13 +5,11 @@ import * as path from 'path'; import * as vscode from 'vscode'; -import * as nls from 'vscode-nls'; import type * as Proto from '../protocol'; import { ITypeScriptServiceClient, ServerResponse } from '../typescriptService'; import { nulToken } from '../utils/cancellation'; import { TypeScriptServiceConfiguration } from './configuration'; -const localize = nls.loadMessageBundle(); export const enum ProjectType { TypeScript, @@ -121,14 +119,14 @@ export async function openProjectConfigOrPromptToCreate( const CreateConfigItem: vscode.MessageItem = { title: projectType === ProjectType.TypeScript - ? localize('typescript.configureTsconfigQuickPick', 'Configure tsconfig.json') - : localize('typescript.configureJsconfigQuickPick', 'Configure jsconfig.json'), + ? vscode.l10n.t("Configure tsconfig.json") + : vscode.l10n.t("Configure jsconfig.json"), }; const selected = await vscode.window.showInformationMessage( (projectType === ProjectType.TypeScript - ? localize('typescript.noTypeScriptProjectConfig', 'File is not part of a TypeScript project. View the [tsconfig.json documentation]({0}) to learn more.', 'https://go.microsoft.com/fwlink/?linkid=841896') - : localize('typescript.noJavaScriptProjectConfig', 'File is not part of a JavaScript project. View the [jsconfig.json documentation]({0}) to learn more.', 'https://go.microsoft.com/fwlink/?linkid=759670') + ? vscode.l10n.t("File is not part of a TypeScript project. View the [tsconfig.json documentation]({0}) to learn more.", 'https://go.microsoft.com/fwlink/?linkid=841896') + : vscode.l10n.t("File is not part of a JavaScript project. View the [jsconfig.json documentation]({0}) to learn more.", 'https://go.microsoft.com/fwlink/?linkid=759670') ), CreateConfigItem); @@ -147,9 +145,7 @@ export async function openProjectConfigForFile( const rootPath = client.getWorkspaceRootForResource(resource); if (!rootPath) { vscode.window.showInformationMessage( - localize( - 'typescript.projectConfigNoWorkspace', - 'Please open a folder in VS Code to use a TypeScript or JavaScript project')); + vscode.l10n.t("Please open a folder in VS Code to use a TypeScript or JavaScript project")); return; } @@ -157,9 +153,7 @@ export async function openProjectConfigForFile( // TSServer errors when 'projectInfo' is invoked on a non js/ts file if (!file || !await client.toPath(resource)) { vscode.window.showWarningMessage( - localize( - 'typescript.projectConfigUnsupportedFile', - 'Could not determine TypeScript or JavaScript project. Unsupported file type')); + vscode.l10n.t("Could not determine TypeScript or JavaScript project. Unsupported file type")); return; } @@ -171,7 +165,7 @@ export async function openProjectConfigForFile( } if (res?.type !== 'response' || !res.body) { - vscode.window.showWarningMessage(localize('typescript.projectConfigCouldNotGetInfo', 'Could not determine TypeScript or JavaScript project')); + vscode.window.showWarningMessage(vscode.l10n.t("Could not determine TypeScript or JavaScript project")); return; } return openProjectConfigOrPromptToCreate(projectType, client, rootPath, res.body.configFileName); diff --git a/extensions/typescript-language-features/src/utils/typingsStatus.ts b/extensions/typescript-language-features/src/utils/typingsStatus.ts index 0fe6e71605d..4924a93ad24 100644 --- a/extensions/typescript-language-features/src/utils/typingsStatus.ts +++ b/extensions/typescript-language-features/src/utils/typingsStatus.ts @@ -4,11 +4,9 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; -import { loadMessageBundle } from 'vscode-nls'; import { ITypeScriptServiceClient } from '../typescriptService'; import { Disposable } from './dispose'; -const localize = loadMessageBundle(); const typingsInstallTimeout = 30 * 1000; @@ -84,7 +82,7 @@ export class AtaProgressReporter extends Disposable { vscode.window.withProgress({ location: vscode.ProgressLocation.Window, - title: localize('installingPackages', "Fetching data for better TypeScript IntelliSense") + title: vscode.l10n.t("Fetching data for better TypeScript IntelliSense") }, () => promise); } @@ -101,11 +99,10 @@ export class AtaProgressReporter extends Disposable { if (config.get('check.npmIsInstalled', true)) { const dontShowAgain: vscode.MessageItem = { - title: localize('typesInstallerInitializationFailed.doNotCheckAgain', "Don't Show Again"), + title: vscode.l10n.t("Don't Show Again"), }; const selected = await vscode.window.showWarningMessage( - localize( - 'typesInstallerInitializationFailed.title', + vscode.l10n.t( "Could not install typings files for JavaScript language features. Please ensure that NPM is installed, or configure 'typescript.npm' in your user settings. Alternatively, check the [documentation]({0}) to learn more.", 'https://go.microsoft.com/fwlink/?linkid=847635' ), diff --git a/extensions/typescript-language-features/yarn.lock b/extensions/typescript-language-features/yarn.lock index 89f3521b9b6..4c5f0cd7e65 100644 --- a/extensions/typescript-language-features/yarn.lock +++ b/extensions/typescript-language-features/yarn.lock @@ -85,11 +85,6 @@ tas-client@0.1.58: dependencies: axios "^0.26.1" -vscode-nls@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-5.2.0.tgz#3cb6893dd9bd695244d8a024bdf746eea665cc3f" - integrity sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng== - vscode-tas-client@^0.1.63: version "0.1.63" resolved "https://registry.yarnpkg.com/vscode-tas-client/-/vscode-tas-client-0.1.63.tgz#df89e67e9bf7ecb46471a0fb8a4a522d2aafad65" From f60ff405f48f1bdd98fc6dade3572a607997e3d5 Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Fri, 4 Nov 2022 12:41:17 +0100 Subject: [PATCH 106/185] Git - Add "OK, Don't Ask Again" button to the publish branch prompt (#165487) Add "OK, Don't Ask Again" button to the publish branch prompt --- extensions/git/src/commands.ts | 21 +++++++++++++++------ extensions/git/src/main.ts | 2 +- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/extensions/git/src/commands.ts b/extensions/git/src/commands.ts index 076691d1a7c..1ff16ab7c39 100644 --- a/extensions/git/src/commands.ts +++ b/extensions/git/src/commands.ts @@ -5,7 +5,7 @@ import * as os from 'os'; import * as path from 'path'; -import { Command, commands, Disposable, LineChange, MessageOptions, Position, ProgressLocation, QuickPickItem, Range, SourceControlResourceState, TextDocumentShowOptions, TextEditor, Uri, ViewColumn, window, workspace, WorkspaceEdit, WorkspaceFolder, TimelineItem, env, Selection, TextDocumentContentProvider, InputBoxValidationSeverity, TabInputText, TabInputTextMerge, QuickPickItemKind, TextDocument, LogOutputChannel, l10n } from 'vscode'; +import { Command, commands, Disposable, LineChange, MessageOptions, Position, ProgressLocation, QuickPickItem, Range, SourceControlResourceState, TextDocumentShowOptions, TextEditor, Uri, ViewColumn, window, workspace, WorkspaceEdit, WorkspaceFolder, TimelineItem, env, Selection, TextDocumentContentProvider, InputBoxValidationSeverity, TabInputText, TabInputTextMerge, QuickPickItemKind, TextDocument, LogOutputChannel, l10n, Memento } from 'vscode'; import TelemetryReporter from '@vscode/extension-telemetry'; import { uniqueNamesGenerator, adjectives, animals, colors, NumberDictionary } from '@joaomoreno/unique-names-generator'; import { Branch, ForcePushMode, GitErrorCodes, Ref, RefType, Status, CommitOptions, RemoteSourcePublisher, Remote } from './api/git'; @@ -351,6 +351,7 @@ export class CommandCenter { constructor( private git: Git, private model: Model, + private globalState: Memento, private logger: LogOutputChannel, private telemetryReporter: TelemetryReporter ) { @@ -2544,12 +2545,20 @@ export class CommandCenter { return; } - const branchName = repository.HEAD.name; - const message = l10n.t('The branch "{0}" has no remote branch. Would you like to publish this branch?', branchName); - const yes = l10n.t('OK'); - const pick = await window.showWarningMessage(message, { modal: true }, yes); + if (this.globalState.get('confirmBranchPublish', true)) { + const branchName = repository.HEAD.name; + const message = l10n.t('The branch "{0}" has no remote branch. Would you like to publish this branch?', branchName); + const yes = l10n.t('OK'); + const neverAgain = l10n.t('OK, Don\'t Ask Again'); + const pick = await window.showWarningMessage(message, { modal: true }, yes, neverAgain); - if (pick === yes) { + if (pick === yes || pick === neverAgain) { + if (pick === neverAgain) { + this.globalState.update('confirmBranchPublish', false); + } + await this.publish(repository); + } + } else { await this.publish(repository); } } diff --git a/extensions/git/src/main.ts b/extensions/git/src/main.ts index 87ddb61e4ca..54faa7aa0f8 100644 --- a/extensions/git/src/main.ts +++ b/extensions/git/src/main.ts @@ -106,7 +106,7 @@ async function createModel(context: ExtensionContext, logger: LogOutputChannel, git.onOutput.addListener('log', onOutput); disposables.push(toDisposable(() => git.onOutput.removeListener('log', onOutput))); - const cc = new CommandCenter(git, model, logger, telemetryReporter); + const cc = new CommandCenter(git, model, context.globalState, logger, telemetryReporter); disposables.push( cc, new GitFileSystemProvider(model), From 2423a7a71483c4b560880665d349e56ed13bd019 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Fri, 4 Nov 2022 12:41:50 +0100 Subject: [PATCH 107/185] support updating installed extensions (#165485) * support updating installed extensions when installed externally (cli, manual) * :lipstick: * refactor --- .../abstractExtensionManagementService.ts | 2 +- .../common/extensionManagement.ts | 1 - .../common/extensionsProfileScannerService.ts | 67 ++++- .../node/extensionManagementService.ts | 113 +++++++-- .../node/extensionsWatcher.ts | 238 +++++++++--------- 5 files changed, 278 insertions(+), 143 deletions(-) diff --git a/src/vs/platform/extensionManagement/common/abstractExtensionManagementService.ts b/src/vs/platform/extensionManagement/common/abstractExtensionManagementService.ts index 183e4b527c6..52d10a4497b 100644 --- a/src/vs/platform/extensionManagement/common/abstractExtensionManagementService.ts +++ b/src/vs/platform/extensionManagement/common/abstractExtensionManagementService.ts @@ -503,7 +503,7 @@ export abstract class AbstractExtensionManagementService extends Disposable impl } } reportTelemetry(this.telemetryService, 'extensionGallery:uninstall', { extensionData: getLocalExtensionTelemetryData(extension), error }); - this._onDidUninstallExtension.fire({ identifier: extension.identifier, version: extension.manifest.version, error: error?.code, profileLocation: uninstallOptions.profileLocation, applicationScoped: extension.isApplicationScoped }); + this._onDidUninstallExtension.fire({ identifier: extension.identifier, error: error?.code, profileLocation: uninstallOptions.profileLocation, applicationScoped: extension.isApplicationScoped }); }; const allTasks: IUninstallExtensionTask[] = []; diff --git a/src/vs/platform/extensionManagement/common/extensionManagement.ts b/src/vs/platform/extensionManagement/common/extensionManagement.ts index 89907b63d3c..ad98783b795 100644 --- a/src/vs/platform/extensionManagement/common/extensionManagement.ts +++ b/src/vs/platform/extensionManagement/common/extensionManagement.ts @@ -372,7 +372,6 @@ export interface UninstallExtensionEvent { export interface DidUninstallExtensionEvent { readonly identifier: IExtensionIdentifier; - readonly version?: string; readonly error?: string; readonly profileLocation?: URI; readonly applicationScoped?: boolean; diff --git a/src/vs/platform/extensionManagement/common/extensionsProfileScannerService.ts b/src/vs/platform/extensionManagement/common/extensionsProfileScannerService.ts index 5bcb3ee7cdc..ec8ba569dca 100644 --- a/src/vs/platform/extensionManagement/common/extensionsProfileScannerService.ts +++ b/src/vs/platform/extensionManagement/common/extensionsProfileScannerService.ts @@ -6,6 +6,7 @@ import { Queue } from 'vs/base/common/async'; import { VSBuffer } from 'vs/base/common/buffer'; import { Disposable } from 'vs/base/common/lifecycle'; +import { Emitter, Event } from 'vs/base/common/event'; import { ResourceMap } from 'vs/base/common/map'; import { URI, UriComponents } from 'vs/base/common/uri'; import { Metadata } from 'vs/platform/extensionManagement/common/extensionManagement'; @@ -29,18 +30,48 @@ export interface IScannedProfileExtension { readonly metadata?: Metadata; } +export interface ProfileExtensionsEvent { + readonly extensions: readonly IExtension[]; + readonly profileLocation: URI; +} + +export interface DidAddProfileExtensionsEvent extends ProfileExtensionsEvent { + readonly error?: Error; +} + +export interface DidRemoveProfileExtensionsEvent extends ProfileExtensionsEvent { + readonly error?: Error; +} + export const IExtensionsProfileScannerService = createDecorator('IExtensionsProfileScannerService'); export interface IExtensionsProfileScannerService { readonly _serviceBrand: undefined; + readonly onAddExtensions: Event; + readonly onDidAddExtensions: Event; + readonly onRemoveExtensions: Event; + readonly onDidRemoveExtensions: Event; + scanProfileExtensions(profileLocation: URI): Promise; addExtensionsToProfile(extensions: [IExtension, Metadata | undefined][], profileLocation: URI): Promise; - removeExtensionFromProfile(identifier: IExtensionIdentifier, profileLocation: URI): Promise; + removeExtensionFromProfile(extension: IExtension, profileLocation: URI): Promise; } export class ExtensionsProfileScannerService extends Disposable implements IExtensionsProfileScannerService { readonly _serviceBrand: undefined; + private readonly _onAddExtensions = this._register(new Emitter()); + readonly onAddExtensions = this._onAddExtensions.event; + + private readonly _onDidAddExtensions = this._register(new Emitter()); + readonly onDidAddExtensions = this._onDidAddExtensions.event; + + private readonly _onRemoveExtensions = this._register(new Emitter()); + readonly onRemoveExtensions = this._onRemoveExtensions.event; + + private readonly _onDidRemoveExtensions = this._register(new Emitter()); + readonly onDidRemoveExtensions = this._onDidRemoveExtensions.event; + private readonly resourcesAccessQueueMap = new ResourceMap>(); constructor( @@ -54,17 +85,33 @@ export class ExtensionsProfileScannerService extends Disposable implements IExte return this.withProfileExtensions(profileLocation); } - addExtensionsToProfile(extensions: [IExtension, Metadata | undefined][], profileLocation: URI): Promise { - return this.withProfileExtensions(profileLocation, profileExtensions => { - // Remove the existing extension to avoid duplicates - profileExtensions = profileExtensions.filter(e => extensions.some(([extension]) => !areSameExtensions(e.identifier, extension.identifier))); - profileExtensions.push(...extensions.map(([extension, metadata]) => ({ identifier: extension.identifier, version: extension.manifest.version, location: extension.location, metadata }))); - return profileExtensions; - }); + async addExtensionsToProfile(extensions: [IExtension, Metadata | undefined][], profileLocation: URI): Promise { + this._onAddExtensions.fire({ extensions: extensions.map(e => e[0]), profileLocation }); + try { + const allExtensions = await this.withProfileExtensions(profileLocation, profileExtensions => { + // Remove the existing extension to avoid duplicates + profileExtensions = profileExtensions.filter(e => extensions.some(([extension]) => !areSameExtensions(e.identifier, extension.identifier))); + profileExtensions.push(...extensions.map(([extension, metadata]) => ({ identifier: extension.identifier, version: extension.manifest.version, location: extension.location, metadata }))); + return profileExtensions; + }); + const addedExtensions = allExtensions.filter(e => extensions.some(([extension]) => areSameExtensions(e.identifier, extension.identifier))); + this._onDidAddExtensions.fire({ extensions: extensions.map(e => e[0]), profileLocation }); + return addedExtensions; + } catch (error) { + this._onDidAddExtensions.fire({ extensions: extensions.map(e => e[0]), error, profileLocation }); + throw error; + } } - removeExtensionFromProfile(identifier: IExtensionIdentifier, profileLocation: URI): Promise { - return this.withProfileExtensions(profileLocation, profileExtensions => profileExtensions.filter(extension => !(areSameExtensions(extension.identifier, identifier)))); + async removeExtensionFromProfile(extension: IExtension, profileLocation: URI): Promise { + this._onRemoveExtensions.fire({ extensions: [extension], profileLocation }); + try { + await this.withProfileExtensions(profileLocation, profileExtensions => profileExtensions.filter(e => !(areSameExtensions(e.identifier, extension.identifier)))); + this._onDidRemoveExtensions.fire({ extensions: [extension], profileLocation }); + } catch (error) { + this._onDidRemoveExtensions.fire({ extensions: [extension], error, profileLocation }); + throw error; + } } private async withProfileExtensions(file: URI, updateFn?: (extensions: IScannedProfileExtension[]) => IScannedProfileExtension[]): Promise { diff --git a/src/vs/platform/extensionManagement/node/extensionManagementService.ts b/src/vs/platform/extensionManagement/node/extensionManagementService.ts index 683470a4689..78ceab2c947 100644 --- a/src/vs/platform/extensionManagement/node/extensionManagementService.ts +++ b/src/vs/platform/extensionManagement/node/extensionManagementService.ts @@ -9,7 +9,9 @@ import { CancellationToken } from 'vs/base/common/cancellation'; import { IStringDictionary } from 'vs/base/common/collections'; import { toErrorMessage } from 'vs/base/common/errorMessage'; import { getErrorMessage } from 'vs/base/common/errors'; +import { Emitter } from 'vs/base/common/event'; import { Disposable } from 'vs/base/common/lifecycle'; +import { ResourceSet } from 'vs/base/common/map'; import { Schemas } from 'vs/base/common/network'; import * as path from 'vs/base/common/path'; import { isMacintosh, isWindows } from 'vs/base/common/platform'; @@ -35,10 +37,10 @@ import { ExtensionsDownloader } from 'vs/platform/extensionManagement/node/exten import { ExtensionsLifecycle } from 'vs/platform/extensionManagement/node/extensionLifecycle'; import { getManifest } from 'vs/platform/extensionManagement/node/extensionManagementUtil'; import { ExtensionsManifestCache } from 'vs/platform/extensionManagement/node/extensionsManifestCache'; -import { ExtensionsWatcher } from 'vs/platform/extensionManagement/node/extensionsWatcher'; -import { ExtensionType, IExtensionManifest, isApplicationScopedExtension, TargetPlatform } from 'vs/platform/extensions/common/extensions'; +import { DidChangeProfileExtensionsEvent, ExtensionsWatcher } from 'vs/platform/extensionManagement/node/extensionsWatcher'; +import { ExtensionType, IExtension, IExtensionManifest, isApplicationScopedExtension, TargetPlatform } from 'vs/platform/extensions/common/extensions'; import { isEngineValid } from 'vs/platform/extensions/common/extensionValidator'; -import { IFileService } from 'vs/platform/files/common/files'; +import { FileChangesEvent, IFileService } from 'vs/platform/files/common/files'; import { IInstantiationService, refineServiceDecorator } from 'vs/platform/instantiation/common/instantiation'; import { ILogService } from 'vs/platform/log/common/log'; import { IProductService } from 'vs/platform/product/common/productService'; @@ -56,7 +58,7 @@ export const INativeServerExtensionManagementService = refineServiceDecorator; - markAsUninstalled(...extensions: ILocalExtension[]): Promise; + markAsUninstalled(...extensions: IExtension[]): Promise; removeUninstalledExtensions(): Promise; getAllUserInstalled(): Promise; } @@ -80,7 +82,7 @@ export class ExtensionManagementService extends AbstractExtensionManagementServi @IInstantiationService instantiationService: IInstantiationService, @IFileService private readonly fileService: IFileService, @IProductService productService: IProductService, - @IUriIdentityService uriIdentityService: IUriIdentityService, + @IUriIdentityService private readonly uriIdentityService: IUriIdentityService, @IUserDataProfilesService userDataProfilesService: IUserDataProfilesService ) { super(galleryService, telemetryService, logService, productService, userDataProfilesService); @@ -88,14 +90,10 @@ export class ExtensionManagementService extends AbstractExtensionManagementServi this.extensionsScanner = this._register(instantiationService.createInstance(ExtensionsScanner, extension => extensionLifecycle.postUninstall(extension))); this.manifestCache = this._register(new ExtensionsManifestCache(environmentService, this)); this.extensionsDownloader = this._register(instantiationService.createInstance(ExtensionsDownloader)); - const extensionsWatcher = this._register(new ExtensionsWatcher(this, userDataProfilesService, extensionsProfileScannerService, extensionsScannerService, uriIdentityService, fileService, logService)); - this._register(extensionsWatcher.onDidChangeExtensionsByAnotherSource(({ added, removed }) => { - if (added.length) { - this._onDidInstallExtensions.fire(added); - } - removed.forEach(e => this._onDidUninstallExtension.fire(e)); - })); + const extensionsWatcher = this._register(new ExtensionsWatcher(this, userDataProfilesService, extensionsProfileScannerService, uriIdentityService, fileService, logService)); + this._register(extensionsWatcher.onDidChangeExtensionsByAnotherSource(e => this.onDidChangeExtensionsFromAnotherSource(e))); + this.watchForExtensionsNotInstalledBySystem(); } private _targetPlatformPromise: Promise | undefined; @@ -197,7 +195,7 @@ export class ExtensionManagementService extends AbstractExtensionManagementServi await this.installFromGallery(galleryExtension); } - markAsUninstalled(...extensions: ILocalExtension[]): Promise { + markAsUninstalled(...extensions: IExtension[]): Promise { return this.extensionsScanner.setUninstalled(...extensions); } @@ -276,6 +274,75 @@ export class ExtensionManagementService extends AbstractExtensionManagementServi return files.map(f => ({ path: `extension/${path.relative(extension.location.fsPath, f)}`, localPath: f })); } + private async onDidChangeExtensionsFromAnotherSource({ added, removed }: DidChangeProfileExtensionsEvent): Promise { + if (removed) { + for (const identifier of removed.extensions) { + this._onDidUninstallExtension.fire({ identifier, profileLocation: removed.profileLocation }); + } + } + if (added) { + const extensions = await this.extensionsScanner.scanExtensions(ExtensionType.User, added.profileLocation); + const addedExtensions = extensions.filter(e => added.extensions.some(identifier => areSameExtensions(identifier, e.identifier))); + this._onDidInstallExtensions.fire(addedExtensions.map(local => ({ identifier: local.identifier, local, profileLocation: added.profileLocation, operation: InstallOperation.None }))); + } + } + + private readonly knownDirectories = new ResourceSet(); + private async watchForExtensionsNotInstalledBySystem(): Promise { + this._register(this.extensionsScanner.onExtract(resource => this.knownDirectories.add(resource))); + const stat = await this.fileService.resolve(this.extensionsScannerService.userExtensionsLocation); + for (const childStat of stat.children ?? []) { + if (childStat.isDirectory) { + this.knownDirectories.add(childStat.resource); + } + } + this._register(this.fileService.watch(this.extensionsScannerService.userExtensionsLocation)); + this._register(this.fileService.onDidFilesChange(e => this.onDidFilesChange(e))); + } + + private async onDidFilesChange(e: FileChangesEvent): Promise { + const added: ILocalExtension[] = []; + for (const resource of e.rawAdded) { + // Check if this is a known directory + if (this.knownDirectories.has(resource)) { + continue; + } + + // Is not immediate child of extensions resource + if (!this.uriIdentityService.extUri.isEqual(this.uriIdentityService.extUri.dirname(resource), this.extensionsScannerService.userExtensionsLocation)) { + continue; + } + + // .obsolete file changed + if (this.uriIdentityService.extUri.isEqual(resource, this.uriIdentityService.extUri.joinPath(this.extensionsScannerService.userExtensionsLocation, '.obsolete'))) { + continue; + } + + // Ignore changes to files starting with `.` + if (this.uriIdentityService.extUri.basename(resource).startsWith('.')) { + continue; + } + + // Check if this is a directory + if (!(await this.fileService.stat(resource)).isDirectory) { + continue; + } + + // Check if this is an extension added by another source + // Extension added by another source will not have installed timestamp + const extension = await this.extensionsScanner.scanUserExtensionAtLocation(resource); + if (extension && extension.installedTimestamp === undefined) { + this.knownDirectories.add(resource); + added.push(extension); + } + } + + if (added.length) { + await this.extensionsProfileScannerService.addExtensionsToProfile(added.map(local => ([local, undefined])), this.userDataProfilesService.defaultProfile.extensionsResource); + this._onDidInstallExtensions.fire(added.map(local => ({ local, version: local.manifest.version, identifier: local.identifier, operation: InstallOperation.None, profileLocation: this.userDataProfilesService.defaultProfile.extensionsResource }))); + } + } + } export class ExtensionsScanner extends Disposable { @@ -283,6 +350,9 @@ export class ExtensionsScanner extends Disposable { private readonly uninstalledPath: string; private readonly uninstalledFileLimiter: Queue; + private readonly _onExtract = this._register(new Emitter()); + readonly onExtract = this._onExtract.event; + constructor( private readonly beforeRemovingExtension: (e: ILocalExtension) => Promise, @IFileService private readonly fileService: IFileService, @@ -318,6 +388,18 @@ export class ExtensionsScanner extends Disposable { return Promise.all(scannedExtensions.map(extension => this.toLocalExtension(extension))); } + async scanUserExtensionAtLocation(location: URI): Promise { + try { + const scannedExtension = await this.extensionsScannerService.scanExistingExtension(location, ExtensionType.User, { includeInvalid: true }); + if (scannedExtension) { + return await this.toLocalExtension(scannedExtension); + } + } catch (error) { + this.logService.error(error); + } + return null; + } + async extractUserExtension(extensionKey: ExtensionKey, zipPath: string, metadata: Metadata, token: CancellationToken): Promise { await this.migrateDefaultProfileExtensions(); const folderName = extensionKey.toString(); @@ -334,6 +416,7 @@ export class ExtensionsScanner extends Disposable { await this.extensionsScannerService.updateMetadata(URI.file(tempPath), metadata); try { + this._onExtract.fire(URI.file(extensionPath)); await this.rename(extensionKey, tempPath, extensionPath, Date.now() + (2 * 60 * 1000) /* Retry for 2 minutes */); this.logService.info('Renamed to', extensionPath); } catch (error) { @@ -360,7 +443,7 @@ export class ExtensionsScanner extends Disposable { return this.withUninstalledExtensions(); } - async setUninstalled(...extensions: ILocalExtension[]): Promise { + async setUninstalled(...extensions: IExtension[]): Promise { const extensionKeys: ExtensionKey[] = extensions.map(e => ExtensionKey.create(e)); await this.withUninstalledExtensions(uninstalled => extensionKeys.forEach(extensionKey => { @@ -813,7 +896,7 @@ class UninstallExtensionFromProfileTask extends AbstractExtensionTask impl } protected async doRun(token: CancellationToken): Promise { - await this.extensionsProfileScannerService.removeExtensionFromProfile(this.extension.identifier, this.profileLocation); + await this.extensionsProfileScannerService.removeExtensionFromProfile(this.extension, this.profileLocation); } } diff --git a/src/vs/platform/extensionManagement/node/extensionsWatcher.ts b/src/vs/platform/extensionManagement/node/extensionsWatcher.ts index e04c1b8b869..59a696b209d 100644 --- a/src/vs/platform/extensionManagement/node/extensionsWatcher.ts +++ b/src/vs/platform/extensionManagement/node/extensionsWatcher.ts @@ -3,143 +3,164 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { Emitter, Event } from 'vs/base/common/event'; -import { Disposable } from 'vs/base/common/lifecycle'; +import { Emitter } from 'vs/base/common/event'; +import { combinedDisposable, Disposable, DisposableMap } from 'vs/base/common/lifecycle'; +import { ResourceSet } from 'vs/base/common/map'; import { URI } from 'vs/base/common/uri'; -import { DidUninstallExtensionEvent, InstallExtensionResult, InstallOperation } from 'vs/platform/extensionManagement/common/extensionManagement'; import { getIdAndVersion } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; -import { IExtensionsProfileScannerService } from 'vs/platform/extensionManagement/common/extensionsProfileScannerService'; -import { IExtensionsScannerService } from 'vs/platform/extensionManagement/common/extensionsScannerService'; +import { DidAddProfileExtensionsEvent, DidRemoveProfileExtensionsEvent, IExtensionsProfileScannerService, ProfileExtensionsEvent } from 'vs/platform/extensionManagement/common/extensionsProfileScannerService'; import { INativeServerExtensionManagementService } from 'vs/platform/extensionManagement/node/extensionManagementService'; -import { ExtensionIdentifier, IExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; -import { FileChangeType, IFileChange, IFileService } from 'vs/platform/files/common/files'; +import { ExtensionIdentifier, IExtension, IExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; +import { FileChangesEvent, FileChangeType, IFileService } from 'vs/platform/files/common/files'; import { ILogService } from 'vs/platform/log/common/log'; import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; import { IUserDataProfile, IUserDataProfilesService } from 'vs/platform/userDataProfile/common/userDataProfile'; +export interface DidChangeProfileExtensionsEvent { + readonly added?: { readonly extensions: readonly IExtensionIdentifier[]; readonly profileLocation: URI }; + readonly removed?: { readonly extensions: readonly IExtensionIdentifier[]; readonly profileLocation: URI }; +} + export class ExtensionsWatcher extends Disposable { - private readonly _onDidChangeExtensionsByAnotherSource = this._register(new Emitter<{ added: InstallExtensionResult[]; removed: DidUninstallExtensionEvent[] }>()); + private readonly _onDidChangeExtensionsByAnotherSource = this._register(new Emitter()); readonly onDidChangeExtensionsByAnotherSource = this._onDidChangeExtensionsByAnotherSource.event; - private readonly profileExtensionsLocations = new Map; + private readonly allExtensions = new Map; + private readonly extensionsProfileWatchDisposables = this._register(new DisposableMap()); constructor( private readonly extensionManagementService: INativeServerExtensionManagementService, private readonly userDataProfilesService: IUserDataProfilesService, private readonly extensionsProfileScannerService: IExtensionsProfileScannerService, - private readonly extensionsScannerService: IExtensionsScannerService, private readonly uriIdentityService: IUriIdentityService, private readonly fileService: IFileService, private readonly logService: ILogService, ) { super(); - this.initialize().then(() => this.registerListeners(), error => logService.error(error)); + this.initialize().then(null, error => logService.error(error)); } private async initialize(): Promise { await this.extensionManagementService.migrateDefaultProfileExtensions(); await this.onDidChangeProfiles(this.userDataProfilesService.profiles, []); + this.registerListeners(); await this.uninstallExtensionsNotInProfiles(); } private registerListeners(): void { this._register(this.userDataProfilesService.onDidChangeProfiles(e => this.onDidChangeProfiles(e.added, e.removed))); - this._register(this.extensionManagementService.onDidInstallExtensions(e => this.onDidInstallExtensions(e))); - this._register(this.extensionManagementService.onDidUninstallExtension(e => this.onDidUninstallExtension(e))); - this._register(this.fileService.watch(this.extensionsScannerService.userExtensionsLocation)); - this._register(Event.filter(this.fileService.onDidFilesChange, e => e.rawChanges.some(change => this.doesChangeAffects(change, this.extensionsScannerService.userExtensionsLocation)))(() => this.onDidChange())); - } - - private doesChangeAffects(change: IFileChange, extensionsResource: URI): boolean { - // Only interested in added/deleted changes - if (change.type !== FileChangeType.ADDED && change.type !== FileChangeType.DELETED) { - return false; - } - - // Is not immediate child of extensions resource - if (!this.uriIdentityService.extUri.isEqual(this.uriIdentityService.extUri.dirname(change.resource), extensionsResource)) { - return false; - } - - // .obsolete file changed - if (this.uriIdentityService.extUri.isEqual(change.resource, this.uriIdentityService.extUri.joinPath(extensionsResource, '.obsolete'))) { - return true; - } - - // Ignore changes to files starting with `.` - if (this.uriIdentityService.extUri.basename(change.resource).startsWith('.')) { - return false; - } - - return true; - } - - private async onDidChange(): Promise { - const installed = await this.extensionManagementService.getAllUserInstalled(); - const added = installed.filter(e => { - if (e.installedTimestamp !== undefined) { - return false; - } - if (this.profileExtensionsLocations.has(this.getKey(e.identifier, e.manifest.version))) { - return false; - } - this.logService.info('Detected extension installed from another source', e.identifier.id); - return true; - }); - if (added.length) { - await this.extensionsProfileScannerService.addExtensionsToProfile(added.map(e => [e, undefined]), this.userDataProfilesService.defaultProfile.extensionsResource); - this._onDidChangeExtensionsByAnotherSource.fire({ - added: added.map(local => ({ - identifier: local.identifier, - operation: InstallOperation.None, - profileLocation: this.userDataProfilesService.defaultProfile.extensionsResource, - local - })), - removed: [] - }); - } + this._register(this.extensionsProfileScannerService.onAddExtensions(e => this.onAddExtensions(e))); + this._register(this.extensionsProfileScannerService.onDidAddExtensions(e => this.onDidAddExtensions(e))); + this._register(this.extensionsProfileScannerService.onRemoveExtensions(e => this.onRemoveExtensions(e))); + this._register(this.extensionsProfileScannerService.onDidRemoveExtensions(e => this.onDidRemoveExtensions(e))); + this._register(this.fileService.onDidFilesChange(e => this.onDidFilesChange(e))); } private async onDidChangeProfiles(added: readonly IUserDataProfile[], removed: readonly IUserDataProfile[]): Promise { try { - await Promise.all(removed.map(profile => this.removeExtensionsFromProfile(profile.extensionsResource))); + await Promise.all(removed.map(profile => { + this.extensionsProfileWatchDisposables.deleteAndDispose(profile.id); + return this.removeExtensionsFromProfile(profile.extensionsResource); + })); } catch (error) { this.logService.error(error); } try { if (added.length) { - await Promise.all(added.map(profile => this.populateExtensionsFromProfile(profile.extensionsResource))); + await Promise.all(added.map(profile => { + this.extensionsProfileWatchDisposables.set(profile.id, combinedDisposable( + this.fileService.watch(this.uriIdentityService.extUri.dirname(profile.extensionsResource)), + // Also listen to the resource incase the resource is a symlink - https://github.com/microsoft/vscode/issues/118134 + this.fileService.watch(profile.extensionsResource) + )); + return this.populateExtensionsFromProfile(profile.extensionsResource); + })); } } catch (error) { this.logService.error(error); } } - private async uninstallExtensionsNotInProfiles(): Promise { - const installed = await this.extensionManagementService.getAllUserInstalled(); - const toUninstall = installed.filter(installedExtension => !this.profileExtensionsLocations.has(this.getKey(installedExtension.identifier, installedExtension.manifest.version))); - if (toUninstall.length) { - await this.extensionManagementService.markAsUninstalled(...toUninstall); + private async onAddExtensions(e: ProfileExtensionsEvent): Promise { + for (const extension of e.extensions) { + this.addExtensionWithKey(this.getKey(extension.identifier, extension.manifest.version), e.profileLocation); } } - private async onDidInstallExtensions(installedExtensions: readonly InstallExtensionResult[]): Promise { - for (const { local, profileLocation } of installedExtensions) { - if (!local || !profileLocation) { - continue; + private async onDidAddExtensions(e: DidAddProfileExtensionsEvent): Promise { + for (const extension of e.extensions) { + const key = this.getKey(extension.identifier, extension.manifest.version); + if (e.error) { + this.removeExtensionWithKey(key, e.profileLocation); + } else { + this.addExtensionWithKey(key, e.profileLocation); } - this.addExtensionWithKey(this.getKey(local.identifier, local.manifest.version), profileLocation); } } - private async onDidUninstallExtension(e: DidUninstallExtensionEvent): Promise { - if (!e.profileLocation || !e.version) { - return; + private async onRemoveExtensions(e: ProfileExtensionsEvent): Promise { + for (const extension of e.extensions) { + this.removeExtensionWithKey(this.getKey(extension.identifier, extension.manifest.version), e.profileLocation); } - if (this.removeExtensionWithKey(this.getKey(e.identifier, e.version), e.profileLocation)) { - await this.uninstallExtensions([{ identifier: e.identifier, version: e.version }]); + } + + private async onDidRemoveExtensions(e: DidRemoveProfileExtensionsEvent): Promise { + const extensionsToUninstall: IExtension[] = []; + for (const extension of e.extensions) { + const key = this.getKey(extension.identifier, extension.manifest.version); + if (e.error) { + this.addExtensionWithKey(key, e.profileLocation); + } else { + this.removeExtensionWithKey(key, e.profileLocation); + if (!this.allExtensions.has(key)) { + extensionsToUninstall.push(extension); + } + } + } + if (extensionsToUninstall.length) { + await this.extensionManagementService.markAsUninstalled(...extensionsToUninstall); + } + } + + private onDidFilesChange(e: FileChangesEvent): void { + for (const profile of this.userDataProfilesService.profiles) { + if (e.contains(profile.extensionsResource, FileChangeType.UPDATED, FileChangeType.ADDED)) { + this.onDidExtensionsProfileChange(profile.extensionsResource); + } + } + } + + private async onDidExtensionsProfileChange(profileLocation: URI): Promise { + const added: IExtensionIdentifier[] = [], removed: IExtensionIdentifier[] = []; + const extensions = await this.extensionsProfileScannerService.scanProfileExtensions(profileLocation); + const extensionKeys = new Set(); + const cached = new Set(); + for (const [key, profiles] of this.allExtensions) { + if (profiles.has(profileLocation)) { + cached.add(key); + } + } + for (const extension of extensions) { + const key = this.getKey(extension.identifier, extension.version); + extensionKeys.add(key); + if (!cached.has(key)) { + added.push(extension.identifier); + this.addExtensionWithKey(key, profileLocation); + } + } + for (const key of cached) { + if (!extensionKeys.has(key)) { + const extension = this.fromKey(key); + if (extension) { + removed.push(extension.identifier); + this.removeExtensionWithKey(key, profileLocation); + } + } + } + if (added.length || removed.length) { + this._onDidChangeExtensionsByAnotherSource.fire({ added: added.length ? { extensions: added, profileLocation } : undefined, removed: removed.length ? { extensions: removed, profileLocation } : undefined }); } } @@ -151,50 +172,35 @@ export class ExtensionsWatcher extends Disposable { } private async removeExtensionsFromProfile(removedProfile: URI): Promise { - const extensionsToRemove: { identifier: IExtensionIdentifier; version: string }[] = []; - for (const key of [...this.profileExtensionsLocations.keys()]) { - if (!this.removeExtensionWithKey(key, removedProfile)) { - continue; - } - const extensionToRemove = this.fromKey(key); - if (extensionToRemove) { - extensionsToRemove.push(extensionToRemove); - } + for (const key of [...this.allExtensions.keys()]) { + this.removeExtensionWithKey(key, removedProfile); } - if (extensionsToRemove.length) { - await this.uninstallExtensions(extensionsToRemove); + await this.uninstallExtensionsNotInProfiles(); + } + + private async uninstallExtensionsNotInProfiles(): Promise { + const installed = await this.extensionManagementService.getAllUserInstalled(); + const toUninstall = installed.filter(installedExtension => !this.allExtensions.has(this.getKey(installedExtension.identifier, installedExtension.manifest.version))); + if (toUninstall.length) { + await this.extensionManagementService.markAsUninstalled(...toUninstall); } } private addExtensionWithKey(key: string, extensionsProfileLocation: URI): void { - let locations = this.profileExtensionsLocations.get(key); - if (!locations) { - locations = []; - this.profileExtensionsLocations.set(key, locations); + let profiles = this.allExtensions.get(key); + if (!profiles) { + this.allExtensions.set(key, profiles = new ResourceSet((uri) => this.uriIdentityService.extUri.getComparisonKey(uri))); } - locations.push(extensionsProfileLocation); + profiles.add(extensionsProfileLocation); } - private removeExtensionWithKey(key: string, profileLocation: URI): boolean { - const profiles = this.profileExtensionsLocations.get(key); + private removeExtensionWithKey(key: string, profileLocation: URI): void { + const profiles = this.allExtensions.get(key); if (profiles) { - const index = profiles.findIndex(profile => this.uriIdentityService.extUri.isEqual(profile, profileLocation)); - if (index > -1) { - profiles.splice(index, 1); - } + profiles.delete(profileLocation); } - if (!profiles?.length) { - this.profileExtensionsLocations.delete(key); - return true; - } - return false; - } - - private async uninstallExtensions(extensionsToRemove: { identifier: IExtensionIdentifier; version: string }[]): Promise { - const installed = await this.extensionManagementService.getAllUserInstalled(); - const toUninstall = installed.filter(installedExtension => extensionsToRemove.some(e => this.getKey(installedExtension.identifier, installedExtension.manifest.version) === this.getKey(e.identifier, e.version))); - if (toUninstall.length) { - await this.extensionManagementService.markAsUninstalled(...toUninstall); + if (!profiles?.size) { + this.allExtensions.delete(key); } } From b208b8794d9aa056fa0ba63271cc8f6b7e909efa Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Fri, 4 Nov 2022 12:52:28 +0100 Subject: [PATCH 108/185] Git - Optimistic UI plumbing (#165237) --- extensions/git/package.json | 9 ++ extensions/git/package.nls.json | 1 + extensions/git/src/commands.ts | 30 ++--- extensions/git/src/repository.ts | 189 +++++++++++++++++++------------ 4 files changed, 138 insertions(+), 91 deletions(-) diff --git a/extensions/git/package.json b/extensions/git/package.json index a4ec3efa604..ae77863d17b 100644 --- a/extensions/git/package.json +++ b/extensions/git/package.json @@ -2543,6 +2543,15 @@ "default": false, "markdownDescription": "%config.mergeEditor%", "scope": "window" + }, + "git.optimisticUpdate": { + "type": "boolean", + "default": true, + "markdownDescription": "%config.optimisticUpdate%", + "scope": "resource", + "tags": [ + "experimental" + ] } } }, diff --git a/extensions/git/package.nls.json b/extensions/git/package.nls.json index 1cbb8966207..eee625d02d4 100644 --- a/extensions/git/package.nls.json +++ b/extensions/git/package.nls.json @@ -236,6 +236,7 @@ "config.repositoryScanMaxDepth": "Controls the depth used when scanning workspace folders for Git repositories when `#git.autoRepositoryDetection#` is set to `true` or `subFolders`. Can be set to `-1` for no limit.", "config.useIntegratedAskPass": "Controls whether GIT_ASKPASS should be overwritten to use the integrated version.", "config.mergeEditor": "Open the merge editor for files that are currently under conflict.", + "config.optimisticUpdate": "Controls whether to optimistically update the state of the Source Control view after running git commands.", "submenu.explorer": "Git", "submenu.commit": "Commit", "submenu.commit.amend": "Amend", diff --git a/extensions/git/src/commands.ts b/extensions/git/src/commands.ts index 1ff16ab7c39..4a2acd2f2dd 100644 --- a/extensions/git/src/commands.ts +++ b/extensions/git/src/commands.ts @@ -1571,7 +1571,7 @@ export class CommandCenter { repository: Repository, getCommitMessage: () => Promise, opts: CommitOptions - ): Promise { + ): Promise { const config = workspace.getConfiguration('git', Uri.file(repository.root)); let promptToSaveFilesBeforeCommit = config.get<'always' | 'staged' | 'never'>('promptToSaveFilesBeforeCommit'); @@ -1611,7 +1611,7 @@ export class CommandCenter { noStagedChanges = repository.indexGroup.resourceStates.length === 0; noUnstagedChanges = repository.workingTreeGroup.resourceStates.length === 0; } else if (pick !== commit) { - return false; // do not commit on cancel + return; // do not commit on cancel } } } @@ -1621,7 +1621,7 @@ export class CommandCenter { const suggestSmartCommit = config.get('suggestSmartCommit') === true; if (!suggestSmartCommit) { - return false; + return; } // prompt the user if we want to commit all or not @@ -1635,9 +1635,9 @@ export class CommandCenter { config.update('enableSmartCommit', true, true); } else if (pick === never) { config.update('suggestSmartCommit', false, true); - return false; + return; } else if (pick !== yes) { - return false; // do not commit on cancel + return; // do not commit on cancel } } @@ -1683,7 +1683,7 @@ export class CommandCenter { const answer = await window.showInformationMessage(l10n.t('There are no changes to commit.'), commitAnyway); if (answer !== commitAnyway) { - return false; + return; } opts.empty = true; @@ -1692,7 +1692,7 @@ export class CommandCenter { if (opts.noVerify) { if (!config.get('allowNoVerifyCommit')) { await window.showErrorMessage(l10n.t('Commits without verification are not allowed, please enable them with the "git.allowNoVerifyCommit" setting.')); - return false; + return; } if (config.get('confirmNoVerifyCommit')) { @@ -1704,7 +1704,7 @@ export class CommandCenter { if (pick === neverAgain) { config.update('confirmNoVerifyCommit', false, true); } else if (pick !== yes) { - return false; + return; } } } @@ -1712,7 +1712,7 @@ export class CommandCenter { const message = await getCommitMessage(); if (!message && !opts.amend && !opts.useEditor) { - return false; + return; } if (opts.all && smartCommitChanges === 'tracked') { @@ -1738,12 +1738,12 @@ export class CommandCenter { } if (!pick) { - return false; + return; } else if (pick === commitToNewBranch) { const branchName = await this.promptForBranchName(repository); if (!branchName) { - return false; + return; } await repository.branch(branchName, true); @@ -1751,8 +1751,6 @@ export class CommandCenter { } await repository.commit(message, opts); - - return true; } private async commitWithAnyInput(repository: Repository, opts: CommitOptions): Promise { @@ -1790,11 +1788,7 @@ export class CommandCenter { return _message; }; - const didCommit = await this.smartCommit(repository, getCommitMessage, opts); - - if (message && didCommit) { - repository.inputBox.value = await repository.getInputTemplate(); - } + await this.smartCommit(repository, getCommitMessage, opts); } @command('git.commit', { repository: true }) diff --git a/extensions/git/src/repository.ts b/extensions/git/src/repository.ts index b937fcdccaa..f86b0549f9a 100644 --- a/extensions/git/src/repository.ts +++ b/extensions/git/src/repository.ts @@ -447,6 +447,13 @@ export interface GitResourceGroup extends SourceControlResourceGroup { resourceStates: Resource[]; } +interface GitResourceGroups { + indexGroup?: Resource[]; + mergeGroup?: Resource[]; + untrackedGroup?: Resource[]; + workingTreeGroup?: Resource[]; +} + export interface OperationResult { operation: Operation; error: any; @@ -974,7 +981,7 @@ export class Repository implements Disposable { || e.affectsConfiguration('git.ignoreSubmodules', root) || e.affectsConfiguration('git.openDiffOnClick', root) || e.affectsConfiguration('git.showActionButton', root) - )(this.updateModelState, this, this.disposables); + )(() => this.updateModelState(), this, this.disposables); const updateInputBoxVisibility = () => { const config = workspace.getConfiguration('git', root); @@ -1247,40 +1254,53 @@ export class Repository implements Disposable { } async commit(message: string | undefined, opts: CommitOptions = Object.create(null)): Promise { - const indexResources = [...this.indexGroup.resourceStates.map(r => r.resourceUri.fsPath)]; - const workingGroupResources = opts.all && opts.all !== 'tracked' ? - [...this.workingTreeGroup.resourceStates.map(r => r.resourceUri.fsPath)] : []; - if (this.rebaseCommit) { - await this.run(Operation.RebaseContinue, async () => { - if (opts.all) { - const addOpts = opts.all === 'tracked' ? { update: true } : {}; - await this.repository.add([], addOpts); - } + await this.run( + Operation.RebaseContinue, + async () => { + if (opts.all) { + const addOpts = opts.all === 'tracked' ? { update: true } : {}; + await this.repository.add([], addOpts); + } - await this.repository.rebaseContinue(); - this.closeDiffEditors(indexResources, workingGroupResources); - }); + await this.repository.rebaseContinue(); + await this.commitOperationCleanup(message, opts); + }); } else { // Set post-commit command to render the correct action button this.commitCommandCenter.postCommitCommand = opts.postCommitCommand; - await this.run(Operation.Commit, async () => { - if (opts.all) { - const addOpts = opts.all === 'tracked' ? { update: true } : {}; - await this.repository.add([], addOpts); - } + await this.run( + Operation.Commit, + async () => { + if (opts.all) { + const addOpts = opts.all === 'tracked' ? { update: true } : {}; + await this.repository.add([], addOpts); + } - delete opts.all; + delete opts.all; - if (opts.requireUserConfig === undefined || opts.requireUserConfig === null) { - const config = workspace.getConfiguration('git', Uri.file(this.root)); - opts.requireUserConfig = config.get('requireGitUserConfig'); - } + if (opts.requireUserConfig === undefined || opts.requireUserConfig === null) { + const config = workspace.getConfiguration('git', Uri.file(this.root)); + opts.requireUserConfig = config.get('requireGitUserConfig'); + } - await this.repository.commit(message, opts); - this.closeDiffEditors(indexResources, workingGroupResources); - }); + await this.repository.commit(message, opts); + await this.commitOperationCleanup(message, opts); + }, + (): GitResourceGroups => { + let untrackedGroup: Resource[] | undefined = undefined, + workingTreeGroup: Resource[] | undefined = undefined; + + if (opts.all === 'tracked') { + workingTreeGroup = this.workingTreeGroup.resourceStates + .filter(r => r.type === Status.UNTRACKED); + } else if (opts.all) { + untrackedGroup = workingTreeGroup = []; + } + + return { indexGroup: [], untrackedGroup, workingTreeGroup }; + }); // Execute post-commit command await this.run(Operation.PostCommitCommand, async () => { @@ -1289,6 +1309,18 @@ export class Repository implements Disposable { } } + private async commitOperationCleanup(message: string | undefined, opts: CommitOptions) { + if (message) { + this.inputBox.value = await this.getInputTemplate(); + } + + const indexResources = [...this.indexGroup.resourceStates.map(r => r.resourceUri.fsPath)]; + const workingGroupResources = opts.all && opts.all !== 'tracked' ? + [...this.workingTreeGroup.resourceStates.map(r => r.resourceUri.fsPath)] : []; + + this.closeDiffEditors(indexResources, workingGroupResources); + } + async clean(resources: Uri[]): Promise { await this.run(Operation.Clean, async () => { const toClean: string[] = []; @@ -1869,7 +1901,10 @@ export class Repository implements Disposable { } } - private async run(operation: Operation, runOperation: () => Promise = () => Promise.resolve(null)): Promise { + private async run( + operation: Operation, + runOperation: () => Promise = () => Promise.resolve(null), + getOptimisticResourceGroups: () => GitResourceGroups | undefined = () => undefined): Promise { if (this.state !== RepositoryState.Idle) { throw new Error('Repository not initialized'); } @@ -1883,7 +1918,10 @@ export class Repository implements Disposable { const result = await this.retryRun(operation, runOperation); if (!isReadOnly(operation)) { - await this.updateModelState(); + const scopedConfig = workspace.getConfiguration('git', Uri.file(this.repository.root)); + const optimisticUpdate = scopedConfig.get('optimisticUpdate') === true; + + await this.updateModelState(optimisticUpdate ? getOptimisticResourceGroups() : undefined); } return result; @@ -1942,18 +1980,14 @@ export class Repository implements Disposable { return folderPaths.filter(p => !ignored.has(p)); } - private async updateModelState() { + private async updateModelState(optimisticResourcesGroups?: GitResourceGroups) { this.updateModelStateCancellationTokenSource?.cancel(); this.updateModelStateCancellationTokenSource = new CancellationTokenSource(); - await this._updateModelState(this.updateModelStateCancellationTokenSource.token); + await this._updateModelState(optimisticResourcesGroups, this.updateModelStateCancellationTokenSource.token); } - private async _updateModelState(cancellationToken?: CancellationToken): Promise { - if (cancellationToken && cancellationToken.isCancellationRequested) { - return; - } - + private async _updateModelState(optimisticResourcesGroups?: GitResourceGroups, cancellationToken?: CancellationToken): Promise { try { const config = workspace.getConfiguration('git'); let sort = config.get<'alphabetically' | 'committerdate'>('branchSortOrder') || 'alphabetically'; @@ -1961,13 +1995,12 @@ export class Repository implements Disposable { sort = 'alphabetically'; } - const [HEAD, refs, remotes, submodules, status, rebaseCommit, mergeInProgress, commitTemplate] = + const [HEAD, refs, remotes, submodules, rebaseCommit, mergeInProgress, commitTemplate] = await Promise.all([ this.repository.getHEADBranch(), this.repository.getRefs({ sort }), this.repository.getRemotes(), this.repository.getSubmodules(), - this.getStatus(cancellationToken), this.getRebaseCommit(), this.isMergeInProgress(), this.getInputTemplate()]); @@ -1979,18 +2012,15 @@ export class Repository implements Disposable { this.rebaseCommit = rebaseCommit; this.mergeInProgress = mergeInProgress; - // set resource groups - this.mergeGroup.resourceStates = status.merge; - this.indexGroup.resourceStates = status.index; - this.workingTreeGroup.resourceStates = status.workingTree; - this.untrackedGroup.resourceStates = status.untracked; - - // set count badge - this.setCountBadge(); - - this._onDidChangeStatus.fire(); - this._sourceControl.commitTemplate = commitTemplate; + + // Optimistically update the resource states + if (optimisticResourcesGroups) { + this._updateResourceGroupsState(optimisticResourcesGroups); + } + + // Update resource states based on status information + this._updateResourceGroupsState(await this.getStatus(cancellationToken)); } catch (err) { if (err instanceof CancellationError) { @@ -2001,7 +2031,20 @@ export class Repository implements Disposable { } } - private async getStatus(cancellationToken?: CancellationToken): Promise<{ index: Resource[]; workingTree: Resource[]; merge: Resource[]; untracked: Resource[] }> { + private _updateResourceGroupsState(resourcesGroups: GitResourceGroups): void { + // set resource groups + if (resourcesGroups.indexGroup) { this.indexGroup.resourceStates = resourcesGroups.indexGroup; } + if (resourcesGroups.mergeGroup) { this.mergeGroup.resourceStates = resourcesGroups.mergeGroup; } + if (resourcesGroups.untrackedGroup) { this.untrackedGroup.resourceStates = resourcesGroups.untrackedGroup; } + if (resourcesGroups.workingTreeGroup) { this.workingTreeGroup.resourceStates = resourcesGroups.workingTreeGroup; } + + // set count badge + this.setCountBadge(); + + this._onDidChangeStatus.fire(); + } + + private async getStatus(cancellationToken?: CancellationToken): Promise { if (cancellationToken && cancellationToken.isCancellationRequested) { throw new CancellationError(); } @@ -2088,10 +2131,10 @@ export class Repository implements Disposable { } } - const index: Resource[] = [], - workingTree: Resource[] = [], - merge: Resource[] = [], - untracked: Resource[] = []; + const indexGroup: Resource[] = [], + mergeGroup: Resource[] = [], + untrackedGroup: Resource[] = [], + workingTreeGroup: Resource[] = []; status.forEach(raw => { const uri = Uri.file(path.join(this.repository.root, raw.path)); @@ -2101,42 +2144,42 @@ export class Repository implements Disposable { switch (raw.x + raw.y) { case '??': switch (untrackedChanges) { - case 'mixed': return workingTree.push(new Resource(this.resourceCommandResolver, ResourceGroupType.WorkingTree, uri, Status.UNTRACKED, useIcons)); - case 'separate': return untracked.push(new Resource(this.resourceCommandResolver, ResourceGroupType.Untracked, uri, Status.UNTRACKED, useIcons)); + case 'mixed': return workingTreeGroup.push(new Resource(this.resourceCommandResolver, ResourceGroupType.WorkingTree, uri, Status.UNTRACKED, useIcons)); + case 'separate': return untrackedGroup.push(new Resource(this.resourceCommandResolver, ResourceGroupType.Untracked, uri, Status.UNTRACKED, useIcons)); default: return undefined; } case '!!': switch (untrackedChanges) { - case 'mixed': return workingTree.push(new Resource(this.resourceCommandResolver, ResourceGroupType.WorkingTree, uri, Status.IGNORED, useIcons)); - case 'separate': return untracked.push(new Resource(this.resourceCommandResolver, ResourceGroupType.Untracked, uri, Status.IGNORED, useIcons)); + case 'mixed': return workingTreeGroup.push(new Resource(this.resourceCommandResolver, ResourceGroupType.WorkingTree, uri, Status.IGNORED, useIcons)); + case 'separate': return untrackedGroup.push(new Resource(this.resourceCommandResolver, ResourceGroupType.Untracked, uri, Status.IGNORED, useIcons)); default: return undefined; } - case 'DD': return merge.push(new Resource(this.resourceCommandResolver, ResourceGroupType.Merge, uri, Status.BOTH_DELETED, useIcons)); - case 'AU': return merge.push(new Resource(this.resourceCommandResolver, ResourceGroupType.Merge, uri, Status.ADDED_BY_US, useIcons)); - case 'UD': return merge.push(new Resource(this.resourceCommandResolver, ResourceGroupType.Merge, uri, Status.DELETED_BY_THEM, useIcons)); - case 'UA': return merge.push(new Resource(this.resourceCommandResolver, ResourceGroupType.Merge, uri, Status.ADDED_BY_THEM, useIcons)); - case 'DU': return merge.push(new Resource(this.resourceCommandResolver, ResourceGroupType.Merge, uri, Status.DELETED_BY_US, useIcons)); - case 'AA': return merge.push(new Resource(this.resourceCommandResolver, ResourceGroupType.Merge, uri, Status.BOTH_ADDED, useIcons)); - case 'UU': return merge.push(new Resource(this.resourceCommandResolver, ResourceGroupType.Merge, uri, Status.BOTH_MODIFIED, useIcons)); + case 'DD': return mergeGroup.push(new Resource(this.resourceCommandResolver, ResourceGroupType.Merge, uri, Status.BOTH_DELETED, useIcons)); + case 'AU': return mergeGroup.push(new Resource(this.resourceCommandResolver, ResourceGroupType.Merge, uri, Status.ADDED_BY_US, useIcons)); + case 'UD': return mergeGroup.push(new Resource(this.resourceCommandResolver, ResourceGroupType.Merge, uri, Status.DELETED_BY_THEM, useIcons)); + case 'UA': return mergeGroup.push(new Resource(this.resourceCommandResolver, ResourceGroupType.Merge, uri, Status.ADDED_BY_THEM, useIcons)); + case 'DU': return mergeGroup.push(new Resource(this.resourceCommandResolver, ResourceGroupType.Merge, uri, Status.DELETED_BY_US, useIcons)); + case 'AA': return mergeGroup.push(new Resource(this.resourceCommandResolver, ResourceGroupType.Merge, uri, Status.BOTH_ADDED, useIcons)); + case 'UU': return mergeGroup.push(new Resource(this.resourceCommandResolver, ResourceGroupType.Merge, uri, Status.BOTH_MODIFIED, useIcons)); } switch (raw.x) { - case 'M': index.push(new Resource(this.resourceCommandResolver, ResourceGroupType.Index, uri, Status.INDEX_MODIFIED, useIcons)); break; - case 'A': index.push(new Resource(this.resourceCommandResolver, ResourceGroupType.Index, uri, Status.INDEX_ADDED, useIcons)); break; - case 'D': index.push(new Resource(this.resourceCommandResolver, ResourceGroupType.Index, uri, Status.INDEX_DELETED, useIcons)); break; - case 'R': index.push(new Resource(this.resourceCommandResolver, ResourceGroupType.Index, uri, Status.INDEX_RENAMED, useIcons, renameUri)); break; - case 'C': index.push(new Resource(this.resourceCommandResolver, ResourceGroupType.Index, uri, Status.INDEX_COPIED, useIcons, renameUri)); break; + case 'M': indexGroup.push(new Resource(this.resourceCommandResolver, ResourceGroupType.Index, uri, Status.INDEX_MODIFIED, useIcons)); break; + case 'A': indexGroup.push(new Resource(this.resourceCommandResolver, ResourceGroupType.Index, uri, Status.INDEX_ADDED, useIcons)); break; + case 'D': indexGroup.push(new Resource(this.resourceCommandResolver, ResourceGroupType.Index, uri, Status.INDEX_DELETED, useIcons)); break; + case 'R': indexGroup.push(new Resource(this.resourceCommandResolver, ResourceGroupType.Index, uri, Status.INDEX_RENAMED, useIcons, renameUri)); break; + case 'C': indexGroup.push(new Resource(this.resourceCommandResolver, ResourceGroupType.Index, uri, Status.INDEX_COPIED, useIcons, renameUri)); break; } switch (raw.y) { - case 'M': workingTree.push(new Resource(this.resourceCommandResolver, ResourceGroupType.WorkingTree, uri, Status.MODIFIED, useIcons, renameUri)); break; - case 'D': workingTree.push(new Resource(this.resourceCommandResolver, ResourceGroupType.WorkingTree, uri, Status.DELETED, useIcons, renameUri)); break; - case 'A': workingTree.push(new Resource(this.resourceCommandResolver, ResourceGroupType.WorkingTree, uri, Status.INTENT_TO_ADD, useIcons, renameUri)); break; + case 'M': workingTreeGroup.push(new Resource(this.resourceCommandResolver, ResourceGroupType.WorkingTree, uri, Status.MODIFIED, useIcons, renameUri)); break; + case 'D': workingTreeGroup.push(new Resource(this.resourceCommandResolver, ResourceGroupType.WorkingTree, uri, Status.DELETED, useIcons, renameUri)); break; + case 'A': workingTreeGroup.push(new Resource(this.resourceCommandResolver, ResourceGroupType.WorkingTree, uri, Status.INTENT_TO_ADD, useIcons, renameUri)); break; } return undefined; }); - return { index, workingTree, merge, untracked }; + return { indexGroup, mergeGroup, untrackedGroup, workingTreeGroup }; } private setCountBadge(): void { From 9aba7db0b474d5e4d20f50c77d59b930db4d41bb Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Fri, 4 Nov 2022 13:37:37 +0100 Subject: [PATCH 109/185] Reduce unused exports (#165494) --- .../browser/ui/iconLabel/iconLabelHover.ts | 2 +- src/vs/base/common/codicons.ts | 18 +----------------- src/vs/base/common/iconLabels.ts | 2 +- src/vs/base/test/common/iconLabels.test.ts | 2 +- .../editor/common/services/getIconClasses.ts | 2 +- .../folding/browser/indentRangeProvider.ts | 4 ++-- .../folding/browser/syntaxRangeProvider.ts | 4 ++-- .../gotoError/browser/gotoErrorWidget.ts | 14 +++++++------- .../browser/parameterHintsWidget.ts | 2 +- .../contrib/suggest/browser/suggestWidget.ts | 18 +++++++++--------- .../suggest/browser/suggestWidgetRenderer.ts | 2 +- .../common/tokenClassificationRegistry.ts | 16 ++++++++-------- .../theme/test/common/testThemeService.ts | 4 ++-- .../contrib/debug/browser/exceptionWidget.ts | 4 ++-- .../preferences/browser/preferencesIcons.ts | 3 --- .../contrib/scm/browser/dirtydiffDecorator.ts | 18 +++++++++--------- .../searchEditor/browser/searchEditor.ts | 2 +- .../browser/walkThroughPart.ts | 2 +- .../test/browser/configurationService.test.ts | 2 +- .../services/themes/common/colorThemeSchema.ts | 1 - .../services/themes/common/plistParser.ts | 7 +------ .../themes/common/workbenchThemeService.ts | 6 ------ 22 files changed, 52 insertions(+), 83 deletions(-) diff --git a/src/vs/base/browser/ui/iconLabel/iconLabelHover.ts b/src/vs/base/browser/ui/iconLabel/iconLabelHover.ts index d380683b564..34625f28787 100644 --- a/src/vs/base/browser/ui/iconLabel/iconLabelHover.ts +++ b/src/vs/base/browser/ui/iconLabel/iconLabelHover.ts @@ -30,7 +30,7 @@ export function setupNativeHover(htmlElement: HTMLElement, tooltip: string | ITo } } -export type IHoverContent = string | ITooltipMarkdownString | HTMLElement | undefined; +type IHoverContent = string | ITooltipMarkdownString | HTMLElement | undefined; type IResolvedHoverContent = IMarkdownString | string | HTMLElement | undefined; /** diff --git a/src/vs/base/common/codicons.ts b/src/vs/base/common/codicons.ts index 9d60df36d53..604d4f872c5 100644 --- a/src/vs/base/common/codicons.ts +++ b/src/vs/base/common/codicons.ts @@ -3,14 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { Event } from 'vs/base/common/event'; - -export interface IIconRegistry { - readonly all: IterableIterator; - readonly onDidRegister: Event; - get(id: string): Codicon | undefined; -} - // Selects all codicon names encapsulated in the `$()` syntax and wraps the // results with spaces so that screen readers can read the text better. export function getCodiconAriaLabel(text: string | undefined) { @@ -598,14 +590,6 @@ export class Codicon implements CSSIcon { public static readonly quickInputBack = new Codicon('quick-input-back', Codicon.arrowLeft.definition); } -export function getClassNamesArray(id: string, modifier?: string) { - const classNames = ['codicon', 'codicon-' + id]; - if (modifier) { - classNames.push('codicon-modifier-' + modifier); - } - return classNames; -} - export interface CSSIcon { readonly id: string; } @@ -630,7 +614,7 @@ export namespace CSSIcon { const [, id, modifier] = match; const classNames = ['codicon', 'codicon-' + id]; if (modifier) { - classNames.push('codicon-modifier-' + modifier.substr(1)); + classNames.push('codicon-modifier-' + modifier.substring(1)); } return classNames; } diff --git a/src/vs/base/common/iconLabels.ts b/src/vs/base/common/iconLabels.ts index 19b420230de..2579e137480 100644 --- a/src/vs/base/common/iconLabels.ts +++ b/src/vs/base/common/iconLabels.ts @@ -7,7 +7,7 @@ import { CSSIcon } from 'vs/base/common/codicons'; import { IMatch, matchesFuzzy } from 'vs/base/common/filters'; import { ltrim } from 'vs/base/common/strings'; -export const iconStartMarker = '$('; +const iconStartMarker = '$('; const iconsRegex = new RegExp(`\\$\\(${CSSIcon.iconNameExpression}(?:${CSSIcon.iconModifierExpression})?\\)`, 'g'); // no capturing groups const iconNameCharacterRegexp = new RegExp(CSSIcon.iconNameCharacter); diff --git a/src/vs/base/test/common/iconLabels.test.ts b/src/vs/base/test/common/iconLabels.test.ts index dec436a52c3..36359bea63e 100644 --- a/src/vs/base/test/common/iconLabels.test.ts +++ b/src/vs/base/test/common/iconLabels.test.ts @@ -7,7 +7,7 @@ import * as assert from 'assert'; import { IMatch } from 'vs/base/common/filters'; import { escapeIcons, IParsedLabelWithIcons, markdownEscapeEscapedIcons, matchesFuzzyIconAware, parseLabelWithIcons, stripIcons } from 'vs/base/common/iconLabels'; -export interface IIconFilter { +interface IIconFilter { // Returns null if word doesn't match. (query: string, target: IParsedLabelWithIcons): IMatch[] | null; } diff --git a/src/vs/editor/common/services/getIconClasses.ts b/src/vs/editor/common/services/getIconClasses.ts index 38f13bf83c7..464555c63fb 100644 --- a/src/vs/editor/common/services/getIconClasses.ts +++ b/src/vs/editor/common/services/getIconClasses.ts @@ -109,6 +109,6 @@ function detectLanguageId(modelService: IModelService, languageService: ILanguag return languageService.guessLanguageIdByFilepathOrFirstLine(resource); } -export function cssEscape(str: string): string { +function cssEscape(str: string): string { return str.replace(/[\11\12\14\15\40]/g, '/'); // HTML class names can not contain certain whitespace characters, use / instead, which doesn't exist in file names. } diff --git a/src/vs/editor/contrib/folding/browser/indentRangeProvider.ts b/src/vs/editor/contrib/folding/browser/indentRangeProvider.ts index 77e52059f65..bb3662caafc 100644 --- a/src/vs/editor/contrib/folding/browser/indentRangeProvider.ts +++ b/src/vs/editor/contrib/folding/browser/indentRangeProvider.ts @@ -13,7 +13,7 @@ import { FoldingLimitReporter, RangeProvider } from './folding'; const MAX_FOLDING_REGIONS_FOR_INDENT_DEFAULT = 5000; -export const ID_INDENT_PROVIDER = 'indent'; +const ID_INDENT_PROVIDER = 'indent'; export class IndentRangeProvider implements RangeProvider { readonly id = ID_INDENT_PROVIDER; @@ -35,7 +35,7 @@ export class IndentRangeProvider implements RangeProvider { } // public only for testing -export class RangesCollector { +class RangesCollector { private readonly _startIndexes: number[]; private readonly _endIndexes: number[]; private readonly _indentOccurrences: number[]; diff --git a/src/vs/editor/contrib/folding/browser/syntaxRangeProvider.ts b/src/vs/editor/contrib/folding/browser/syntaxRangeProvider.ts index 47192b6701f..93f41829b63 100644 --- a/src/vs/editor/contrib/folding/browser/syntaxRangeProvider.ts +++ b/src/vs/editor/contrib/folding/browser/syntaxRangeProvider.ts @@ -18,7 +18,7 @@ export interface IFoldingRangeData extends FoldingRange { const foldingContext: FoldingContext = { }; -export const ID_SYNTAX_PROVIDER = 'syntax'; +const ID_SYNTAX_PROVIDER = 'syntax'; export class SyntaxRangeProvider implements RangeProvider { @@ -82,7 +82,7 @@ function collectSyntaxRanges(providers: FoldingRangeProvider[], model: ITextMode }); } -export class RangesCollector { +class RangesCollector { private readonly _startIndexes: number[]; private readonly _endIndexes: number[]; private readonly _nestingLevels: number[]; diff --git a/src/vs/editor/contrib/gotoError/browser/gotoErrorWidget.ts b/src/vs/editor/contrib/gotoError/browser/gotoErrorWidget.ts index b665430a058..3094d31f515 100644 --- a/src/vs/editor/contrib/gotoError/browser/gotoErrorWidget.ts +++ b/src/vs/editor/contrib/gotoError/browser/gotoErrorWidget.ts @@ -401,13 +401,13 @@ const errorDefault = oneOf(editorErrorForeground, editorErrorBorder); const warningDefault = oneOf(editorWarningForeground, editorWarningBorder); const infoDefault = oneOf(editorInfoForeground, editorInfoBorder); -export const editorMarkerNavigationError = registerColor('editorMarkerNavigationError.background', { dark: errorDefault, light: errorDefault, hcDark: contrastBorder, hcLight: contrastBorder }, nls.localize('editorMarkerNavigationError', 'Editor marker navigation widget error color.')); -export const editorMarkerNavigationErrorHeader = registerColor('editorMarkerNavigationError.headerBackground', { dark: transparent(editorMarkerNavigationError, .1), light: transparent(editorMarkerNavigationError, .1), hcDark: null, hcLight: null }, nls.localize('editorMarkerNavigationErrorHeaderBackground', 'Editor marker navigation widget error heading background.')); +const editorMarkerNavigationError = registerColor('editorMarkerNavigationError.background', { dark: errorDefault, light: errorDefault, hcDark: contrastBorder, hcLight: contrastBorder }, nls.localize('editorMarkerNavigationError', 'Editor marker navigation widget error color.')); +const editorMarkerNavigationErrorHeader = registerColor('editorMarkerNavigationError.headerBackground', { dark: transparent(editorMarkerNavigationError, .1), light: transparent(editorMarkerNavigationError, .1), hcDark: null, hcLight: null }, nls.localize('editorMarkerNavigationErrorHeaderBackground', 'Editor marker navigation widget error heading background.')); -export const editorMarkerNavigationWarning = registerColor('editorMarkerNavigationWarning.background', { dark: warningDefault, light: warningDefault, hcDark: contrastBorder, hcLight: contrastBorder }, nls.localize('editorMarkerNavigationWarning', 'Editor marker navigation widget warning color.')); -export const editorMarkerNavigationWarningHeader = registerColor('editorMarkerNavigationWarning.headerBackground', { dark: transparent(editorMarkerNavigationWarning, .1), light: transparent(editorMarkerNavigationWarning, .1), hcDark: '#0C141F', hcLight: transparent(editorMarkerNavigationWarning, .2) }, nls.localize('editorMarkerNavigationWarningBackground', 'Editor marker navigation widget warning heading background.')); +const editorMarkerNavigationWarning = registerColor('editorMarkerNavigationWarning.background', { dark: warningDefault, light: warningDefault, hcDark: contrastBorder, hcLight: contrastBorder }, nls.localize('editorMarkerNavigationWarning', 'Editor marker navigation widget warning color.')); +const editorMarkerNavigationWarningHeader = registerColor('editorMarkerNavigationWarning.headerBackground', { dark: transparent(editorMarkerNavigationWarning, .1), light: transparent(editorMarkerNavigationWarning, .1), hcDark: '#0C141F', hcLight: transparent(editorMarkerNavigationWarning, .2) }, nls.localize('editorMarkerNavigationWarningBackground', 'Editor marker navigation widget warning heading background.')); -export const editorMarkerNavigationInfo = registerColor('editorMarkerNavigationInfo.background', { dark: infoDefault, light: infoDefault, hcDark: contrastBorder, hcLight: contrastBorder }, nls.localize('editorMarkerNavigationInfo', 'Editor marker navigation widget info color.')); -export const editorMarkerNavigationInfoHeader = registerColor('editorMarkerNavigationInfo.headerBackground', { dark: transparent(editorMarkerNavigationInfo, .1), light: transparent(editorMarkerNavigationInfo, .1), hcDark: null, hcLight: null }, nls.localize('editorMarkerNavigationInfoHeaderBackground', 'Editor marker navigation widget info heading background.')); +const editorMarkerNavigationInfo = registerColor('editorMarkerNavigationInfo.background', { dark: infoDefault, light: infoDefault, hcDark: contrastBorder, hcLight: contrastBorder }, nls.localize('editorMarkerNavigationInfo', 'Editor marker navigation widget info color.')); +const editorMarkerNavigationInfoHeader = registerColor('editorMarkerNavigationInfo.headerBackground', { dark: transparent(editorMarkerNavigationInfo, .1), light: transparent(editorMarkerNavigationInfo, .1), hcDark: null, hcLight: null }, nls.localize('editorMarkerNavigationInfoHeaderBackground', 'Editor marker navigation widget info heading background.')); -export const editorMarkerNavigationBackground = registerColor('editorMarkerNavigation.background', { dark: editorBackground, light: editorBackground, hcDark: editorBackground, hcLight: editorBackground }, nls.localize('editorMarkerNavigationBackground', 'Editor marker navigation widget background.')); +const editorMarkerNavigationBackground = registerColor('editorMarkerNavigation.background', { dark: editorBackground, light: editorBackground, hcDark: editorBackground, hcLight: editorBackground }, nls.localize('editorMarkerNavigationBackground', 'Editor marker navigation widget background.')); diff --git a/src/vs/editor/contrib/parameterHints/browser/parameterHintsWidget.ts b/src/vs/editor/contrib/parameterHints/browser/parameterHintsWidget.ts index fdedaf63acf..d535cb804d8 100644 --- a/src/vs/editor/contrib/parameterHints/browser/parameterHintsWidget.ts +++ b/src/vs/editor/contrib/parameterHints/browser/parameterHintsWidget.ts @@ -366,7 +366,7 @@ export class ParameterHintsWidget extends Disposable implements IContentWidget { } } -export const editorHoverWidgetHighlightForeground = registerColor('editorHoverWidget.highlightForeground', { dark: listHighlightForeground, light: listHighlightForeground, hcDark: listHighlightForeground, hcLight: listHighlightForeground }, nls.localize('editorHoverWidgetHighlightForeground', 'Foreground color of the active item in the parameter hint.')); +const editorHoverWidgetHighlightForeground = registerColor('editorHoverWidget.highlightForeground', { dark: listHighlightForeground, light: listHighlightForeground, hcDark: listHighlightForeground, hcLight: listHighlightForeground }, nls.localize('editorHoverWidgetHighlightForeground', 'Foreground color of the active item in the parameter hint.')); registerThemingParticipant((theme, collector) => { const border = theme.getColor(editorHoverBorder); diff --git a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts index a0d32b0130d..6348756a490 100644 --- a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts +++ b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts @@ -38,15 +38,15 @@ import { getAriaId, ItemRenderer } from './suggestWidgetRenderer'; /** * Suggest widget colors */ -export const editorSuggestWidgetBackground = registerColor('editorSuggestWidget.background', { dark: editorWidgetBackground, light: editorWidgetBackground, hcDark: editorWidgetBackground, hcLight: editorWidgetBackground }, nls.localize('editorSuggestWidgetBackground', 'Background color of the suggest widget.')); -export const editorSuggestWidgetBorder = registerColor('editorSuggestWidget.border', { dark: editorWidgetBorder, light: editorWidgetBorder, hcDark: editorWidgetBorder, hcLight: editorWidgetBorder }, nls.localize('editorSuggestWidgetBorder', 'Border color of the suggest widget.')); -export const editorSuggestWidgetForeground = registerColor('editorSuggestWidget.foreground', { dark: editorForeground, light: editorForeground, hcDark: editorForeground, hcLight: editorForeground }, nls.localize('editorSuggestWidgetForeground', 'Foreground color of the suggest widget.')); -export const editorSuggestWidgetSelectedForeground = registerColor('editorSuggestWidget.selectedForeground', { dark: quickInputListFocusForeground, light: quickInputListFocusForeground, hcDark: quickInputListFocusForeground, hcLight: quickInputListFocusForeground }, nls.localize('editorSuggestWidgetSelectedForeground', 'Foreground color of the selected entry in the suggest widget.')); -export const editorSuggestWidgetSelectedIconForeground = registerColor('editorSuggestWidget.selectedIconForeground', { dark: quickInputListFocusIconForeground, light: quickInputListFocusIconForeground, hcDark: quickInputListFocusIconForeground, hcLight: quickInputListFocusIconForeground }, nls.localize('editorSuggestWidgetSelectedIconForeground', 'Icon foreground color of the selected entry in the suggest widget.')); -export const editorSuggestWidgetSelectedBackground = registerColor('editorSuggestWidget.selectedBackground', { dark: quickInputListFocusBackground, light: quickInputListFocusBackground, hcDark: quickInputListFocusBackground, hcLight: quickInputListFocusBackground }, nls.localize('editorSuggestWidgetSelectedBackground', 'Background color of the selected entry in the suggest widget.')); -export const editorSuggestWidgetHighlightForeground = registerColor('editorSuggestWidget.highlightForeground', { dark: listHighlightForeground, light: listHighlightForeground, hcDark: listHighlightForeground, hcLight: listHighlightForeground }, nls.localize('editorSuggestWidgetHighlightForeground', 'Color of the match highlights in the suggest widget.')); -export const editorSuggestWidgetHighlightFocusForeground = registerColor('editorSuggestWidget.focusHighlightForeground', { dark: listFocusHighlightForeground, light: listFocusHighlightForeground, hcDark: listFocusHighlightForeground, hcLight: listFocusHighlightForeground }, nls.localize('editorSuggestWidgetFocusHighlightForeground', 'Color of the match highlights in the suggest widget when an item is focused.')); -export const editorSuggestWidgetStatusForeground = registerColor('editorSuggestWidgetStatus.foreground', { dark: transparent(editorSuggestWidgetForeground, .5), light: transparent(editorSuggestWidgetForeground, .5), hcDark: transparent(editorSuggestWidgetForeground, .5), hcLight: transparent(editorSuggestWidgetForeground, .5) }, nls.localize('editorSuggestWidgetStatusForeground', 'Foreground color of the suggest widget status.')); +registerColor('editorSuggestWidget.background', { dark: editorWidgetBackground, light: editorWidgetBackground, hcDark: editorWidgetBackground, hcLight: editorWidgetBackground }, nls.localize('editorSuggestWidgetBackground', 'Background color of the suggest widget.')); +registerColor('editorSuggestWidget.border', { dark: editorWidgetBorder, light: editorWidgetBorder, hcDark: editorWidgetBorder, hcLight: editorWidgetBorder }, nls.localize('editorSuggestWidgetBorder', 'Border color of the suggest widget.')); +const editorSuggestWidgetForeground = registerColor('editorSuggestWidget.foreground', { dark: editorForeground, light: editorForeground, hcDark: editorForeground, hcLight: editorForeground }, nls.localize('editorSuggestWidgetForeground', 'Foreground color of the suggest widget.')); +registerColor('editorSuggestWidget.selectedForeground', { dark: quickInputListFocusForeground, light: quickInputListFocusForeground, hcDark: quickInputListFocusForeground, hcLight: quickInputListFocusForeground }, nls.localize('editorSuggestWidgetSelectedForeground', 'Foreground color of the selected entry in the suggest widget.')); +registerColor('editorSuggestWidget.selectedIconForeground', { dark: quickInputListFocusIconForeground, light: quickInputListFocusIconForeground, hcDark: quickInputListFocusIconForeground, hcLight: quickInputListFocusIconForeground }, nls.localize('editorSuggestWidgetSelectedIconForeground', 'Icon foreground color of the selected entry in the suggest widget.')); +const editorSuggestWidgetSelectedBackground = registerColor('editorSuggestWidget.selectedBackground', { dark: quickInputListFocusBackground, light: quickInputListFocusBackground, hcDark: quickInputListFocusBackground, hcLight: quickInputListFocusBackground }, nls.localize('editorSuggestWidgetSelectedBackground', 'Background color of the selected entry in the suggest widget.')); +registerColor('editorSuggestWidget.highlightForeground', { dark: listHighlightForeground, light: listHighlightForeground, hcDark: listHighlightForeground, hcLight: listHighlightForeground }, nls.localize('editorSuggestWidgetHighlightForeground', 'Color of the match highlights in the suggest widget.')); +registerColor('editorSuggestWidget.focusHighlightForeground', { dark: listFocusHighlightForeground, light: listFocusHighlightForeground, hcDark: listFocusHighlightForeground, hcLight: listFocusHighlightForeground }, nls.localize('editorSuggestWidgetFocusHighlightForeground', 'Color of the match highlights in the suggest widget when an item is focused.')); +registerColor('editorSuggestWidgetStatus.foreground', { dark: transparent(editorSuggestWidgetForeground, .5), light: transparent(editorSuggestWidgetForeground, .5), hcDark: transparent(editorSuggestWidgetForeground, .5), hcLight: transparent(editorSuggestWidgetForeground, .5) }, nls.localize('editorSuggestWidgetStatusForeground', 'Foreground color of the suggest widget status.')); const enum State { Hidden, diff --git a/src/vs/editor/contrib/suggest/browser/suggestWidgetRenderer.ts b/src/vs/editor/contrib/suggest/browser/suggestWidgetRenderer.ts index fc0fb15804c..7a2ca2732c7 100644 --- a/src/vs/editor/contrib/suggest/browser/suggestWidgetRenderer.ts +++ b/src/vs/editor/contrib/suggest/browser/suggestWidgetRenderer.ts @@ -28,7 +28,7 @@ export function getAriaId(index: number): string { return `suggest-aria-id:${index}`; } -export const suggestMoreInfoIcon = registerIcon('suggest-more-info', Codicon.chevronRight, nls.localize('suggestMoreInfoIcon', 'Icon for more information in the suggest widget.')); +const suggestMoreInfoIcon = registerIcon('suggest-more-info', Codicon.chevronRight, nls.localize('suggestMoreInfoIcon', 'Icon for more information in the suggest widget.')); const _completionItemColor = new class ColorExtractor { diff --git a/src/vs/platform/theme/common/tokenClassificationRegistry.ts b/src/vs/platform/theme/common/tokenClassificationRegistry.ts index 673cc34f1a6..a4d5299f01d 100644 --- a/src/vs/platform/theme/common/tokenClassificationRegistry.ts +++ b/src/vs/platform/theme/common/tokenClassificationRegistry.ts @@ -12,19 +12,19 @@ import { Extensions as JSONExtensions, IJSONContributionRegistry } from 'vs/plat import * as platform from 'vs/platform/registry/common/platform'; import { IColorTheme } from 'vs/platform/theme/common/themeService'; -export const TOKEN_TYPE_WILDCARD = '*'; -export const TOKEN_CLASSIFIER_LANGUAGE_SEPARATOR = ':'; -export const CLASSIFIER_MODIFIER_SEPARATOR = '.'; +const TOKEN_TYPE_WILDCARD = '*'; +const TOKEN_CLASSIFIER_LANGUAGE_SEPARATOR = ':'; +const CLASSIFIER_MODIFIER_SEPARATOR = '.'; // qualified string [type|*](.modifier)*(/language)! -export type TokenClassificationString = string; +type TokenClassificationString = string; -export const idPattern = '\\w+[-_\\w+]*'; +const idPattern = '\\w+[-_\\w+]*'; export const typeAndModifierIdPattern = `^${idPattern}$`; -export const selectorPattern = `^(${idPattern}|\\*)(\\${CLASSIFIER_MODIFIER_SEPARATOR}${idPattern})*(${TOKEN_CLASSIFIER_LANGUAGE_SEPARATOR}${idPattern})?$`; +const selectorPattern = `^(${idPattern}|\\*)(\\${CLASSIFIER_MODIFIER_SEPARATOR}${idPattern})*(${TOKEN_CLASSIFIER_LANGUAGE_SEPARATOR}${idPattern})?$`; -export const fontStylePattern = '^(\\s*(italic|bold|underline|strikethrough))*\\s*$'; +const fontStylePattern = '^(\\s*(italic|bold|underline|strikethrough))*\\s*$'; export interface TokenSelector { match(type: string, modifiers: string[], language: string): number; @@ -186,7 +186,7 @@ export namespace SemanticTokenRule { export type TokenStyleValue = TokenStyle | TokenClassificationString; // TokenStyle registry -export const Extensions = { +const Extensions = { TokenClassificationContribution: 'base.contributions.tokenClassification' }; diff --git a/src/vs/platform/theme/test/common/testThemeService.ts b/src/vs/platform/theme/test/common/testThemeService.ts index e3211636370..5109b055e4c 100644 --- a/src/vs/platform/theme/test/common/testThemeService.ts +++ b/src/vs/platform/theme/test/common/testThemeService.ts @@ -40,13 +40,13 @@ export class TestColorTheme implements IColorTheme { } } -export class TestFileIconTheme implements IFileIconTheme { +class TestFileIconTheme implements IFileIconTheme { hasFileIcons = false; hasFolderIcons = false; hidesExplorerArrows = false; } -export class UnthemedProductIconTheme implements IProductIconTheme { +class UnthemedProductIconTheme implements IProductIconTheme { getIcon(contribution: IconContribution) { return undefined; } diff --git a/src/vs/workbench/contrib/debug/browser/exceptionWidget.ts b/src/vs/workbench/contrib/debug/browser/exceptionWidget.ts index d7513063762..2f733465cfc 100644 --- a/src/vs/workbench/contrib/debug/browser/exceptionWidget.ts +++ b/src/vs/workbench/contrib/debug/browser/exceptionWidget.ts @@ -23,8 +23,8 @@ const $ = dom.$; // theming -export const debugExceptionWidgetBorder = registerColor('debugExceptionWidget.border', { dark: '#a31515', light: '#a31515', hcDark: '#a31515', hcLight: '#a31515' }, nls.localize('debugExceptionWidgetBorder', 'Exception widget border color.')); -export const debugExceptionWidgetBackground = registerColor('debugExceptionWidget.background', { dark: '#420b0d', light: '#f1dfde', hcDark: '#420b0d', hcLight: '#f1dfde' }, nls.localize('debugExceptionWidgetBackground', 'Exception widget background color.')); +const debugExceptionWidgetBorder = registerColor('debugExceptionWidget.border', { dark: '#a31515', light: '#a31515', hcDark: '#a31515', hcLight: '#a31515' }, nls.localize('debugExceptionWidgetBorder', 'Exception widget border color.')); +const debugExceptionWidgetBackground = registerColor('debugExceptionWidget.background', { dark: '#420b0d', light: '#f1dfde', hcDark: '#420b0d', hcLight: '#f1dfde' }, nls.localize('debugExceptionWidgetBackground', 'Exception widget background color.')); export class ExceptionWidget extends ZoneWidget { diff --git a/src/vs/workbench/contrib/preferences/browser/preferencesIcons.ts b/src/vs/workbench/contrib/preferences/browser/preferencesIcons.ts index 0c31b455aaf..ce77f864b92 100644 --- a/src/vs/workbench/contrib/preferences/browser/preferencesIcons.ts +++ b/src/vs/workbench/contrib/preferences/browser/preferencesIcons.ts @@ -7,8 +7,6 @@ import { Codicon } from 'vs/base/common/codicons'; import { localize } from 'vs/nls'; import { registerIcon } from 'vs/platform/theme/common/iconRegistry'; -export const settingsGroupExpandedIcon = registerIcon('settings-group-expanded', Codicon.chevronDown, localize('settingsGroupExpandedIcon', 'Icon for an expanded section in the split JSON Settings editor.')); -export const settingsGroupCollapsedIcon = registerIcon('settings-group-collapsed', Codicon.chevronRight, localize('settingsGroupCollapsedIcon', 'Icon for a collapsed section in the split JSON Settings editor.')); export const settingsScopeDropDownIcon = registerIcon('settings-folder-dropdown', Codicon.triangleDown, localize('settingsScopeDropDownIcon', 'Icon for the folder dropdown button in the split JSON Settings editor.')); export const settingsMoreActionIcon = registerIcon('settings-more-action', Codicon.gear, localize('settingsMoreActionIcon', 'Icon for the \'more actions\' action in the Settings UI.')); @@ -19,7 +17,6 @@ export const keybindingsEditIcon = registerIcon('keybindings-edit', Codicon.edit export const keybindingsAddIcon = registerIcon('keybindings-add', Codicon.add, localize('keybindingsAddIcon', 'Icon for the add action in the keybinding UI.')); export const settingsEditIcon = registerIcon('settings-edit', Codicon.edit, localize('settingsEditIcon', 'Icon for the edit action in the Settings UI.')); -export const settingsAddIcon = registerIcon('settings-add', Codicon.add, localize('settingsAddIcon', 'Icon for the add action in the Settings UI.')); export const settingsRemoveIcon = registerIcon('settings-remove', Codicon.close, localize('settingsRemoveIcon', 'Icon for the remove action in the Settings UI.')); export const settingsDiscardIcon = registerIcon('settings-discard', Codicon.discard, localize('preferencesDiscardIcon', 'Icon for the discard action in the Settings UI.')); diff --git a/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator.ts b/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator.ts index 12cbb08a50c..819f4d87672 100644 --- a/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator.ts +++ b/src/vs/workbench/contrib/scm/browser/dirtydiffDecorator.ts @@ -852,51 +852,51 @@ export class DirtyDiffController extends Disposable implements IEditorContributi } } -export const editorGutterModifiedBackground = registerColor('editorGutter.modifiedBackground', { +const editorGutterModifiedBackground = registerColor('editorGutter.modifiedBackground', { dark: '#1B81A8', light: '#2090D3', hcDark: '#1B81A8', hcLight: '#2090D3' }, nls.localize('editorGutterModifiedBackground', "Editor gutter background color for lines that are modified.")); -export const editorGutterAddedBackground = registerColor('editorGutter.addedBackground', { +const editorGutterAddedBackground = registerColor('editorGutter.addedBackground', { dark: '#487E02', light: '#48985D', hcDark: '#487E02', hcLight: '#48985D' }, nls.localize('editorGutterAddedBackground', "Editor gutter background color for lines that are added.")); -export const editorGutterDeletedBackground = registerColor('editorGutter.deletedBackground', { +const editorGutterDeletedBackground = registerColor('editorGutter.deletedBackground', { dark: editorErrorForeground, light: editorErrorForeground, hcDark: editorErrorForeground, hcLight: editorErrorForeground }, nls.localize('editorGutterDeletedBackground', "Editor gutter background color for lines that are deleted.")); -export const minimapGutterModifiedBackground = registerColor('minimapGutter.modifiedBackground', { +const minimapGutterModifiedBackground = registerColor('minimapGutter.modifiedBackground', { dark: editorGutterModifiedBackground, light: editorGutterModifiedBackground, hcDark: editorGutterModifiedBackground, hcLight: editorGutterModifiedBackground }, nls.localize('minimapGutterModifiedBackground', "Minimap gutter background color for lines that are modified.")); -export const minimapGutterAddedBackground = registerColor('minimapGutter.addedBackground', { +const minimapGutterAddedBackground = registerColor('minimapGutter.addedBackground', { dark: editorGutterAddedBackground, light: editorGutterAddedBackground, hcDark: editorGutterAddedBackground, hcLight: editorGutterAddedBackground }, nls.localize('minimapGutterAddedBackground', "Minimap gutter background color for lines that are added.")); -export const minimapGutterDeletedBackground = registerColor('minimapGutter.deletedBackground', { +const minimapGutterDeletedBackground = registerColor('minimapGutter.deletedBackground', { dark: editorGutterDeletedBackground, light: editorGutterDeletedBackground, hcDark: editorGutterDeletedBackground, hcLight: editorGutterDeletedBackground }, nls.localize('minimapGutterDeletedBackground', "Minimap gutter background color for lines that are deleted.")); -export const overviewRulerModifiedForeground = registerColor('editorOverviewRuler.modifiedForeground', { dark: transparent(editorGutterModifiedBackground, 0.6), light: transparent(editorGutterModifiedBackground, 0.6), hcDark: transparent(editorGutterModifiedBackground, 0.6), hcLight: transparent(editorGutterModifiedBackground, 0.6) }, nls.localize('overviewRulerModifiedForeground', 'Overview ruler marker color for modified content.')); -export const overviewRulerAddedForeground = registerColor('editorOverviewRuler.addedForeground', { dark: transparent(editorGutterAddedBackground, 0.6), light: transparent(editorGutterAddedBackground, 0.6), hcDark: transparent(editorGutterAddedBackground, 0.6), hcLight: transparent(editorGutterAddedBackground, 0.6) }, nls.localize('overviewRulerAddedForeground', 'Overview ruler marker color for added content.')); -export const overviewRulerDeletedForeground = registerColor('editorOverviewRuler.deletedForeground', { dark: transparent(editorGutterDeletedBackground, 0.6), light: transparent(editorGutterDeletedBackground, 0.6), hcDark: transparent(editorGutterDeletedBackground, 0.6), hcLight: transparent(editorGutterDeletedBackground, 0.6) }, nls.localize('overviewRulerDeletedForeground', 'Overview ruler marker color for deleted content.')); +const overviewRulerModifiedForeground = registerColor('editorOverviewRuler.modifiedForeground', { dark: transparent(editorGutterModifiedBackground, 0.6), light: transparent(editorGutterModifiedBackground, 0.6), hcDark: transparent(editorGutterModifiedBackground, 0.6), hcLight: transparent(editorGutterModifiedBackground, 0.6) }, nls.localize('overviewRulerModifiedForeground', 'Overview ruler marker color for modified content.')); +const overviewRulerAddedForeground = registerColor('editorOverviewRuler.addedForeground', { dark: transparent(editorGutterAddedBackground, 0.6), light: transparent(editorGutterAddedBackground, 0.6), hcDark: transparent(editorGutterAddedBackground, 0.6), hcLight: transparent(editorGutterAddedBackground, 0.6) }, nls.localize('overviewRulerAddedForeground', 'Overview ruler marker color for added content.')); +const overviewRulerDeletedForeground = registerColor('editorOverviewRuler.deletedForeground', { dark: transparent(editorGutterDeletedBackground, 0.6), light: transparent(editorGutterDeletedBackground, 0.6), hcDark: transparent(editorGutterDeletedBackground, 0.6), hcLight: transparent(editorGutterDeletedBackground, 0.6) }, nls.localize('overviewRulerDeletedForeground', 'Overview ruler marker color for deleted content.')); class DirtyDiffDecorator extends Disposable { diff --git a/src/vs/workbench/contrib/searchEditor/browser/searchEditor.ts b/src/vs/workbench/contrib/searchEditor/browser/searchEditor.ts index 54be4156b6e..a187de8b635 100644 --- a/src/vs/workbench/contrib/searchEditor/browser/searchEditor.ts +++ b/src/vs/workbench/contrib/searchEditor/browser/searchEditor.ts @@ -747,7 +747,7 @@ registerThemingParticipant((theme, collector) => { } }); -export const searchEditorTextInputBorder = registerColor('searchEditor.textInputBorder', { dark: inputBorder, light: inputBorder, hcDark: inputBorder, hcLight: inputBorder }, localize('textInputBoxBorder', "Search editor text input box border.")); +const searchEditorTextInputBorder = registerColor('searchEditor.textInputBorder', { dark: inputBorder, light: inputBorder, hcDark: inputBorder, hcLight: inputBorder }, localize('textInputBoxBorder', "Search editor text input box border.")); function findNextRange(matchRanges: Range[], currentPosition: Position) { for (const matchRange of matchRanges) { diff --git a/src/vs/workbench/contrib/welcomeWalkthrough/browser/walkThroughPart.ts b/src/vs/workbench/contrib/welcomeWalkthrough/browser/walkThroughPart.ts index 3e736453267..feb999a7afb 100644 --- a/src/vs/workbench/contrib/welcomeWalkthrough/browser/walkThroughPart.ts +++ b/src/vs/workbench/contrib/welcomeWalkthrough/browser/walkThroughPart.ts @@ -485,7 +485,7 @@ export class WalkThroughPart extends EditorPane { // theming -export const embeddedEditorBackground = registerColor('walkThrough.embeddedEditorBackground', { dark: null, light: null, hcDark: null, hcLight: null }, localize('walkThrough.embeddedEditorBackground', 'Background color for the embedded editors on the Interactive Playground.')); +const embeddedEditorBackground = registerColor('walkThrough.embeddedEditorBackground', { dark: null, light: null, hcDark: null, hcLight: null }, localize('walkThrough.embeddedEditorBackground', 'Background color for the embedded editors on the Interactive Playground.')); registerThemingParticipant((theme, collector) => { const color = getExtraColor(theme, embeddedEditorBackground, { dark: 'rgba(0, 0, 0, .4)', extra_dark: 'rgba(200, 235, 255, .064)', light: '#f4f4f4', hcDark: null, hcLight: null }); diff --git a/src/vs/workbench/services/configuration/test/browser/configurationService.test.ts b/src/vs/workbench/services/configuration/test/browser/configurationService.test.ts index eab8dede672..c37183e8f48 100644 --- a/src/vs/workbench/services/configuration/test/browser/configurationService.test.ts +++ b/src/vs/workbench/services/configuration/test/browser/configurationService.test.ts @@ -2672,7 +2672,7 @@ function getWorkspaceId(configPath: URI): string { return hash(workspaceConfigPath).toString(16); } -export function getWorkspaceIdentifier(configPath: URI): IWorkspaceIdentifier { +function getWorkspaceIdentifier(configPath: URI): IWorkspaceIdentifier { return { configPath, id: getWorkspaceId(configPath) diff --git a/src/vs/workbench/services/themes/common/colorThemeSchema.ts b/src/vs/workbench/services/themes/common/colorThemeSchema.ts index 142c65e0814..4824020a87c 100644 --- a/src/vs/workbench/services/themes/common/colorThemeSchema.ts +++ b/src/vs/workbench/services/themes/common/colorThemeSchema.ts @@ -115,7 +115,6 @@ const textMateScopes = [ ]; export const textmateColorsSchemaId = 'vscode://schemas/textmate-colors'; -export const textmateColorSettingsSchemaId = `${textmateColorsSchemaId}#/definitions/settings`; export const textmateColorGroupSchemaId = `${textmateColorsSchemaId}#/definitions/colorGroup`; const textmateColorSchema: IJSONSchema = { diff --git a/src/vs/workbench/services/themes/common/plistParser.ts b/src/vs/workbench/services/themes/common/plistParser.ts index bf78b296089..d51ce513f66 100644 --- a/src/vs/workbench/services/themes/common/plistParser.ts +++ b/src/vs/workbench/services/themes/common/plistParser.ts @@ -23,11 +23,6 @@ const enum State { DICT_STATE = 1, ARR_STATE = 2 } - -export function parseWithLocation(content: string, filename: string, locationKeyName: string): any { - return _parse(content, filename, locationKeyName); -} - /** * A very fast plist parser */ @@ -494,4 +489,4 @@ function _parse(content: string, filename: string | null, locationKeyName: strin } return cur; -} \ No newline at end of file +} diff --git a/src/vs/workbench/services/themes/common/workbenchThemeService.ts b/src/vs/workbench/services/themes/common/workbenchThemeService.ts index 9d7bc2a6edd..dbcb760c1bc 100644 --- a/src/vs/workbench/services/themes/common/workbenchThemeService.ts +++ b/src/vs/workbench/services/themes/common/workbenchThemeService.ts @@ -181,12 +181,6 @@ export interface ISemanticTokenColorizationSetting { italic?: boolean; } -export interface ExtensionVersion { - publisher: string; - name: string; - version: string; -} - export interface ExtensionData { extensionId: string; extensionPublisher: string; From d0bf29c2e743af64c90ac5cb427bdb0f0e196d2c Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Fri, 4 Nov 2022 13:41:11 +0100 Subject: [PATCH 110/185] do not set appication extensions location for default profile (#165496) --- .../extensionManagement/common/extensionsScannerService.ts | 6 ++++-- .../electron-sandbox/extensionsScannerService.ts | 4 +++- .../extensionManagement/node/extensionsScannerService.ts | 4 +++- .../test/node/extensionsScannerService.test.ts | 4 +++- src/vs/server/node/extensionsScannerService.ts | 4 +++- 5 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/vs/platform/extensionManagement/common/extensionsScannerService.ts b/src/vs/platform/extensionManagement/common/extensionsScannerService.ts index 3a49730edd0..2a763089d41 100644 --- a/src/vs/platform/extensionManagement/common/extensionsScannerService.ts +++ b/src/vs/platform/extensionManagement/common/extensionsScannerService.ts @@ -156,6 +156,7 @@ export abstract class AbstractExtensionsScannerService extends Disposable implem @ILogService protected readonly logService: ILogService, @IEnvironmentService private readonly environmentService: IEnvironmentService, @IProductService private readonly productService: IProductService, + @IUriIdentityService private readonly uriIdentityService: IUriIdentityService, @IInstantiationService private readonly instantiationService: IInstantiationService, ) { super(); @@ -385,7 +386,7 @@ export abstract class AbstractExtensionsScannerService extends Disposable implem private async createExtensionScannerInput(location: URI, profile: boolean, type: ExtensionType, excludeObsolete: boolean, language: string | undefined, validate: boolean = true): Promise { const translations = await this.getTranslations(language ?? platform.language); const mtime = await this.getMtime(location); - const applicationExtensionsLocation = profile ? this.userDataProfilesService.defaultProfile.extensionsResource : undefined; + const applicationExtensionsLocation = profile && !this.uriIdentityService.extUri.isEqual(location, this.userDataProfilesService.defaultProfile.extensionsResource) ? this.userDataProfilesService.defaultProfile.extensionsResource : undefined; const applicationExtensionsLocationMtime = applicationExtensionsLocation ? await this.getMtime(applicationExtensionsLocation) : undefined; return new ExtensionScannerInput( location, @@ -900,6 +901,7 @@ export class NativeExtensionsScannerService extends AbstractExtensionsScannerSer logService: ILogService, environmentService: IEnvironmentService, productService: IProductService, + uriIdentityService: IUriIdentityService, instantiationService: IInstantiationService, ) { super( @@ -907,7 +909,7 @@ export class NativeExtensionsScannerService extends AbstractExtensionsScannerSer userExtensionsLocation, joinPath(userHome, '.vscode-oss-dev', 'extensions', 'control.json'), joinPath(userDataPath, MANIFEST_CACHE_FOLDER), - userDataProfilesService, extensionsProfileScannerService, fileService, logService, environmentService, productService, instantiationService); + userDataProfilesService, extensionsProfileScannerService, fileService, logService, environmentService, productService, uriIdentityService, instantiationService); this.translationsPromise = (async () => { if (platform.translationsConfigFile) { try { diff --git a/src/vs/platform/extensionManagement/electron-sandbox/extensionsScannerService.ts b/src/vs/platform/extensionManagement/electron-sandbox/extensionsScannerService.ts index f99ba24598c..537bd19f1df 100644 --- a/src/vs/platform/extensionManagement/electron-sandbox/extensionsScannerService.ts +++ b/src/vs/platform/extensionManagement/electron-sandbox/extensionsScannerService.ts @@ -12,6 +12,7 @@ import { InstantiationType, registerSingleton } from 'vs/platform/instantiation/ import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ILogService } from 'vs/platform/log/common/log'; import { IProductService } from 'vs/platform/product/common/productService'; +import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; import { IUserDataProfilesService } from 'vs/platform/userDataProfile/common/userDataProfile'; export class ExtensionsScannerService extends NativeExtensionsScannerService implements IExtensionsScannerService { @@ -23,6 +24,7 @@ export class ExtensionsScannerService extends NativeExtensionsScannerService imp @ILogService logService: ILogService, @INativeEnvironmentService environmentService: INativeEnvironmentService, @IProductService productService: IProductService, + @IUriIdentityService uriIdentityService: IUriIdentityService, @IInstantiationService instantiationService: IInstantiationService, ) { super( @@ -30,7 +32,7 @@ export class ExtensionsScannerService extends NativeExtensionsScannerService imp URI.file(environmentService.extensionsPath), environmentService.userHome, URI.file(environmentService.userDataPath), - userDataProfilesService, extensionsProfileScannerService, fileService, logService, environmentService, productService, instantiationService); + userDataProfilesService, extensionsProfileScannerService, fileService, logService, environmentService, productService, uriIdentityService, instantiationService); } } diff --git a/src/vs/platform/extensionManagement/node/extensionsScannerService.ts b/src/vs/platform/extensionManagement/node/extensionsScannerService.ts index 20a1fd0a61d..e18299c4ae4 100644 --- a/src/vs/platform/extensionManagement/node/extensionsScannerService.ts +++ b/src/vs/platform/extensionManagement/node/extensionsScannerService.ts @@ -11,6 +11,7 @@ import { IFileService } from 'vs/platform/files/common/files'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ILogService } from 'vs/platform/log/common/log'; import { IProductService } from 'vs/platform/product/common/productService'; +import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; import { IUserDataProfilesService } from 'vs/platform/userDataProfile/common/userDataProfile'; export class ExtensionsScannerService extends NativeExtensionsScannerService implements IExtensionsScannerService { @@ -22,6 +23,7 @@ export class ExtensionsScannerService extends NativeExtensionsScannerService imp @ILogService logService: ILogService, @INativeEnvironmentService environmentService: INativeEnvironmentService, @IProductService productService: IProductService, + @IUriIdentityService uriIdentityService: IUriIdentityService, @IInstantiationService instantiationService: IInstantiationService, ) { super( @@ -29,7 +31,7 @@ export class ExtensionsScannerService extends NativeExtensionsScannerService imp URI.file(environmentService.extensionsPath), environmentService.userHome, URI.file(environmentService.userDataPath), - userDataProfilesService, extensionsProfileScannerService, fileService, logService, environmentService, productService, instantiationService); + userDataProfilesService, extensionsProfileScannerService, fileService, logService, environmentService, productService, uriIdentityService, instantiationService); } } diff --git a/src/vs/platform/extensionManagement/test/node/extensionsScannerService.test.ts b/src/vs/platform/extensionManagement/test/node/extensionsScannerService.test.ts index b0a7ec8ad9a..9a36885212f 100644 --- a/src/vs/platform/extensionManagement/test/node/extensionsScannerService.test.ts +++ b/src/vs/platform/extensionManagement/test/node/extensionsScannerService.test.ts @@ -18,6 +18,7 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; import { ILogService, NullLogService } from 'vs/platform/log/common/log'; import { IProductService } from 'vs/platform/product/common/productService'; +import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; import { UriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentityService'; import { IUserDataProfilesService, UserDataProfilesService } from 'vs/platform/userDataProfile/common/userDataProfile'; @@ -33,6 +34,7 @@ class ExtensionsScannerService extends AbstractExtensionsScannerService implemen @ILogService logService: ILogService, @INativeEnvironmentService nativeEnvironmentService: INativeEnvironmentService, @IProductService productService: IProductService, + @IUriIdentityService uriIdentityService: IUriIdentityService, @IInstantiationService instantiationService: IInstantiationService, ) { super( @@ -40,7 +42,7 @@ class ExtensionsScannerService extends AbstractExtensionsScannerService implemen URI.file(nativeEnvironmentService.extensionsPath), joinPath(nativeEnvironmentService.userHome, '.vscode-oss-dev', 'extensions', 'control.json'), joinPath(ROOT, MANIFEST_CACHE_FOLDER), - userDataProfilesService, extensionsProfileScannerService, fileService, logService, nativeEnvironmentService, productService, instantiationService); + userDataProfilesService, extensionsProfileScannerService, fileService, logService, nativeEnvironmentService, productService, uriIdentityService, instantiationService); } protected async getTranslations(language: string): Promise { diff --git a/src/vs/server/node/extensionsScannerService.ts b/src/vs/server/node/extensionsScannerService.ts index b780ab7d6e8..371332420a8 100644 --- a/src/vs/server/node/extensionsScannerService.ts +++ b/src/vs/server/node/extensionsScannerService.ts @@ -13,6 +13,7 @@ import { IFileService } from 'vs/platform/files/common/files'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ILogService } from 'vs/platform/log/common/log'; import { IProductService } from 'vs/platform/product/common/productService'; +import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; import { IUserDataProfilesService } from 'vs/platform/userDataProfile/common/userDataProfile'; import { getNLSConfiguration, InternalNLSConfiguration } from 'vs/server/node/remoteLanguagePacks'; @@ -25,6 +26,7 @@ export class ExtensionsScannerService extends AbstractExtensionsScannerService i @ILogService logService: ILogService, @INativeEnvironmentService private readonly nativeEnvironmentService: INativeEnvironmentService, @IProductService productService: IProductService, + @IUriIdentityService uriIdentityService: IUriIdentityService, @IInstantiationService instantiationService: IInstantiationService, ) { super( @@ -32,7 +34,7 @@ export class ExtensionsScannerService extends AbstractExtensionsScannerService i URI.file(nativeEnvironmentService.extensionsPath), joinPath(nativeEnvironmentService.userHome, '.vscode-oss-dev', 'extensions', 'control.json'), joinPath(URI.file(nativeEnvironmentService.userDataPath), MANIFEST_CACHE_FOLDER), - userDataProfilesService, extensionsProfileScannerService, fileService, logService, nativeEnvironmentService, productService, instantiationService); + userDataProfilesService, extensionsProfileScannerService, fileService, logService, nativeEnvironmentService, productService, uriIdentityService, instantiationService); } protected async getTranslations(language: string): Promise { From 5a8c62b6856162aac223dd8261219fda5483040e Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Fri, 4 Nov 2022 15:31:07 +0100 Subject: [PATCH 111/185] Progressbar: Use css variables for styling (#165503) Progressbar: Use css variables for styling (for #165478) --- .../browser/ui/progressbar/progressbar.ts | 37 +++---------------- .../parts/quickinput/browser/quickInput.ts | 3 +- .../platform/quickinput/browser/quickInput.ts | 7 ++-- .../platform/theme/browser/defaultStyles.ts | 13 ++++++- src/vs/platform/theme/common/styler.ts | 11 +----- .../workbench/browser/parts/compositePart.ts | 5 +-- .../browser/parts/editor/editorGroupView.ts | 5 +-- .../notifications/notificationsViewer.ts | 7 ++-- .../workbench/browser/parts/views/viewPane.ts | 6 +-- .../contrib/find/notebookFindReplaceWidget.ts | 8 ++-- .../contrib/find/notebookFindWidget.ts | 2 +- .../browser/view/cellParts/cellProgressBar.ts | 5 ++- .../contrib/outline/browser/outlinePane.ts | 6 +-- 13 files changed, 42 insertions(+), 73 deletions(-) diff --git a/src/vs/base/browser/ui/progressbar/progressbar.ts b/src/vs/base/browser/ui/progressbar/progressbar.ts index cd6514e4485..a678626a985 100644 --- a/src/vs/base/browser/ui/progressbar/progressbar.ts +++ b/src/vs/base/browser/ui/progressbar/progressbar.ts @@ -5,9 +5,7 @@ import { hide, show } from 'vs/base/browser/dom'; import { RunOnceScheduler } from 'vs/base/common/async'; -import { Color } from 'vs/base/common/color'; import { Disposable } from 'vs/base/common/lifecycle'; -import { mixin } from 'vs/base/common/objects'; import { isNumber } from 'vs/base/common/types'; import 'vs/css!./progressbar'; @@ -20,13 +18,12 @@ const CSS_DISCRETE = 'discrete'; export interface IProgressBarOptions extends IProgressBarStyles { } +export type CSSValueString = string; + export interface IProgressBarStyles { - progressBarBackground?: Color; + progressBarBackground?: CSSValueString; } -const defaultOpts = { - progressBarBackground: Color.fromHex('#0E70C0') -}; /** * A progress bar with support for infinite or discrete progress. @@ -43,32 +40,25 @@ export class ProgressBar extends Disposable { */ private static readonly LONG_RUNNING_INFINITE_THRESHOLD = 10000; - private options: IProgressBarOptions; private workedVal: number; private element!: HTMLElement; private bit!: HTMLElement; private totalWork: number | undefined; - private progressBarBackground: Color | undefined; private showDelayedScheduler: RunOnceScheduler; private longRunningScheduler: RunOnceScheduler; constructor(container: HTMLElement, options?: IProgressBarOptions) { super(); - this.options = options || Object.create(null); - mixin(this.options, defaultOpts, false); - this.workedVal = 0; - this.progressBarBackground = this.options.progressBarBackground; - this.showDelayedScheduler = this._register(new RunOnceScheduler(() => show(this.element), 0)); this.longRunningScheduler = this._register(new RunOnceScheduler(() => this.infiniteLongRunning(), ProgressBar.LONG_RUNNING_INFINITE_THRESHOLD)); - this.create(container); + this.create(container, options); } - private create(container: HTMLElement): void { + private create(container: HTMLElement, options?: IProgressBarOptions): void { this.element = document.createElement('div'); this.element.classList.add('monaco-progress-container'); this.element.setAttribute('role', 'progressbar'); @@ -77,9 +67,8 @@ export class ProgressBar extends Disposable { this.bit = document.createElement('div'); this.bit.classList.add('progress-bit'); + this.bit.style.backgroundColor = options?.progressBarBackground || '#0E70C0'; this.element.appendChild(this.bit); - - this.applyStyles(); } private off(): void { @@ -223,18 +212,4 @@ export class ProgressBar extends Disposable { hide(this.element); this.showDelayedScheduler.cancel(); } - - style(styles: IProgressBarStyles): void { - this.progressBarBackground = styles.progressBarBackground; - - this.applyStyles(); - } - - protected applyStyles(): void { - if (this.bit) { - const background = this.progressBarBackground ? this.progressBarBackground.toString() : ''; - - this.bit.style.backgroundColor = background; - } - } } diff --git a/src/vs/base/parts/quickinput/browser/quickInput.ts b/src/vs/base/parts/quickinput/browser/quickInput.ts index a770fd6f5c4..6a97b88d5b5 100644 --- a/src/vs/base/parts/quickinput/browser/quickInput.ts +++ b/src/vs/base/parts/quickinput/browser/quickInput.ts @@ -1335,7 +1335,7 @@ export class QuickInputController extends Disposable { } })); - const progressBar = new ProgressBar(container); + const progressBar = new ProgressBar(container, this.styles.progressBar); progressBar.getContainer().classList.add('quick-input-progress'); const focusTracker = dom.trackFocus(container); @@ -1827,7 +1827,6 @@ export class QuickInputController extends Disposable { this.ui.count.style(this.styles.countBadge); this.ui.ok.style(this.styles.button); this.ui.customButton.style(this.styles.button); - this.ui.progressBar.style(this.styles.progressBar); this.ui.list.style(this.styles.list); const content: string[] = []; diff --git a/src/vs/platform/quickinput/browser/quickInput.ts b/src/vs/platform/quickinput/browser/quickInput.ts index c63e724efb6..d0ec435f2ae 100644 --- a/src/vs/platform/quickinput/browser/quickInput.ts +++ b/src/vs/platform/quickinput/browser/quickInput.ts @@ -16,7 +16,8 @@ import { IWorkbenchListOptions, WorkbenchList } from 'vs/platform/list/browser/l import { QuickAccessController } from 'vs/platform/quickinput/browser/quickAccess'; import { IQuickAccessController } from 'vs/platform/quickinput/common/quickAccess'; import { IInputBox, IInputOptions, IKeyMods, IPickOptions, IQuickInputButton, IQuickInputService, IQuickNavigateConfiguration, IQuickPick, IQuickPickItem, QuickPickInput } from 'vs/platform/quickinput/common/quickInput'; -import { activeContrastBorder, badgeBackground, badgeForeground, buttonBackground, buttonForeground, buttonHoverBackground, contrastBorder, inputBackground, inputBorder, inputForeground, inputValidationErrorBackground, inputValidationErrorBorder, inputValidationErrorForeground, inputValidationInfoBackground, inputValidationInfoBorder, inputValidationInfoForeground, inputValidationWarningBackground, inputValidationWarningBorder, inputValidationWarningForeground, keybindingLabelBackground, keybindingLabelBorder, keybindingLabelBottomBorder, keybindingLabelForeground, pickerGroupBorder, pickerGroupForeground, progressBarBackground, quickInputBackground, quickInputForeground, quickInputListFocusBackground, quickInputListFocusForeground, quickInputListFocusIconForeground, quickInputTitleBackground, widgetShadow } from 'vs/platform/theme/common/colorRegistry'; +import { getProgressBarStyles } from 'vs/platform/theme/browser/defaultStyles'; +import { activeContrastBorder, badgeBackground, badgeForeground, buttonBackground, buttonForeground, buttonHoverBackground, contrastBorder, inputBackground, inputBorder, inputForeground, inputValidationErrorBackground, inputValidationErrorBorder, inputValidationErrorForeground, inputValidationInfoBackground, inputValidationInfoBorder, inputValidationInfoForeground, inputValidationWarningBackground, inputValidationWarningBorder, inputValidationWarningForeground, keybindingLabelBackground, keybindingLabelBorder, keybindingLabelBottomBorder, keybindingLabelForeground, pickerGroupBorder, pickerGroupForeground, quickInputBackground, quickInputForeground, quickInputListFocusBackground, quickInputListFocusForeground, quickInputListFocusIconForeground, quickInputTitleBackground, widgetShadow } from 'vs/platform/theme/common/colorRegistry'; import { computeStyles } from 'vs/platform/theme/common/styler'; import { IThemeService, Themable } from 'vs/platform/theme/common/themeService'; @@ -218,9 +219,7 @@ export class QuickInputService extends Themable implements IQuickInputService { buttonHoverBackground, buttonBorder: contrastBorder }), - progressBar: computeStyles(this.theme, { - progressBarBackground - }), + progressBar: getProgressBarStyles(), // default uses progressBarBackground keybindingLabel: computeStyles(this.theme, { keybindingLabelBackground, keybindingLabelForeground, diff --git a/src/vs/platform/theme/browser/defaultStyles.ts b/src/vs/platform/theme/browser/defaultStyles.ts index 3b622a2829d..cccca684835 100644 --- a/src/vs/platform/theme/browser/defaultStyles.ts +++ b/src/vs/platform/theme/browser/defaultStyles.ts @@ -3,7 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import { IKeybindingLabelStyles } from 'vs/base/browser/ui/keybindingLabel/keybindingLabel'; -import { ColorIdentifier, keybindingLabelBackground, keybindingLabelBorder, keybindingLabelBottomBorder, keybindingLabelForeground, asCssValue, widgetShadow } from 'vs/platform/theme/common/colorRegistry'; +import { IProgressBarStyles } from 'vs/base/browser/ui/progressbar/progressbar'; +import { ColorIdentifier, keybindingLabelBackground, keybindingLabelBorder, keybindingLabelBottomBorder, keybindingLabelForeground, asCssValue, widgetShadow, progressBarBackground } from 'vs/platform/theme/common/colorRegistry'; import { IStyleOverrides } from 'vs/platform/theme/common/styler'; @@ -24,3 +25,13 @@ export function getKeybindingLabelStyles(style?: IKeybindingLabelStyleOverrides) keybindingLabelShadow: asCssValue(style?.keybindingLabelShadow || widgetShadow) }; } + +export interface IProgressBarStyleOverrides extends IStyleOverrides { + progressBarBackground?: ColorIdentifier; +} + +export function getProgressBarStyles(style?: IProgressBarStyleOverrides): IProgressBarStyles { + return { + progressBarBackground: asCssValue(style?.progressBarBackground || progressBarBackground) + }; +} diff --git a/src/vs/platform/theme/common/styler.ts b/src/vs/platform/theme/common/styler.ts index f9b69b944ca..7587af95a80 100644 --- a/src/vs/platform/theme/common/styler.ts +++ b/src/vs/platform/theme/common/styler.ts @@ -6,7 +6,7 @@ import { Color } from 'vs/base/common/color'; import { IDisposable } from 'vs/base/common/lifecycle'; import { IThemable, styleFn } from 'vs/base/common/styler'; -import { activeContrastBorder, badgeBackground, badgeForeground, breadcrumbsActiveSelectionForeground, breadcrumbsBackground, breadcrumbsFocusForeground, breadcrumbsForeground, buttonBackground, buttonBorder, buttonForeground, buttonHoverBackground, buttonSecondaryBackground, buttonSecondaryForeground, buttonSecondaryHoverBackground, ColorIdentifier, ColorTransform, ColorValue, contrastBorder, editorWidgetBackground, editorWidgetBorder, editorWidgetForeground, focusBorder, inputActiveOptionBackground, inputActiveOptionBorder, inputActiveOptionForeground, inputBackground, inputBorder, inputForeground, inputValidationErrorBackground, inputValidationErrorBorder, inputValidationErrorForeground, inputValidationInfoBackground, inputValidationInfoBorder, inputValidationInfoForeground, inputValidationWarningBackground, inputValidationWarningBorder, inputValidationWarningForeground, listActiveSelectionBackground, listActiveSelectionForeground, listActiveSelectionIconForeground, listDropBackground, listFilterWidgetBackground, listFilterWidgetNoMatchesOutline, listFilterWidgetOutline, listFocusBackground, listFocusForeground, listFocusOutline, listHoverBackground, listHoverForeground, listInactiveFocusBackground, listInactiveFocusOutline, listInactiveSelectionBackground, listInactiveSelectionForeground, listInactiveSelectionIconForeground, menuBackground, menuBorder, menuForeground, menuSelectionBackground, menuSelectionBorder, menuSelectionForeground, menuSeparatorBackground, pickerGroupForeground, problemsErrorIconForeground, problemsInfoIconForeground, problemsWarningIconForeground, progressBarBackground, quickInputListFocusBackground, quickInputListFocusForeground, quickInputListFocusIconForeground, resolveColorValue, scrollbarShadow, scrollbarSliderActiveBackground, scrollbarSliderBackground, scrollbarSliderHoverBackground, selectBackground, selectBorder, selectForeground, selectListBackground, checkboxBackground, checkboxBorder, checkboxForeground, tableColumnsBorder, tableOddRowsBackgroundColor, textLinkForeground, treeIndentGuidesStroke, widgetShadow, listFocusAndSelectionOutline, listFilterWidgetShadow, buttonSeparator } from 'vs/platform/theme/common/colorRegistry'; +import { activeContrastBorder, badgeBackground, badgeForeground, breadcrumbsActiveSelectionForeground, breadcrumbsBackground, breadcrumbsFocusForeground, breadcrumbsForeground, buttonBackground, buttonBorder, buttonForeground, buttonHoverBackground, buttonSecondaryBackground, buttonSecondaryForeground, buttonSecondaryHoverBackground, ColorIdentifier, ColorTransform, ColorValue, contrastBorder, editorWidgetBackground, editorWidgetBorder, editorWidgetForeground, focusBorder, inputActiveOptionBackground, inputActiveOptionBorder, inputActiveOptionForeground, inputBackground, inputBorder, inputForeground, inputValidationErrorBackground, inputValidationErrorBorder, inputValidationErrorForeground, inputValidationInfoBackground, inputValidationInfoBorder, inputValidationInfoForeground, inputValidationWarningBackground, inputValidationWarningBorder, inputValidationWarningForeground, listActiveSelectionBackground, listActiveSelectionForeground, listActiveSelectionIconForeground, listDropBackground, listFilterWidgetBackground, listFilterWidgetNoMatchesOutline, listFilterWidgetOutline, listFocusBackground, listFocusForeground, listFocusOutline, listHoverBackground, listHoverForeground, listInactiveFocusBackground, listInactiveFocusOutline, listInactiveSelectionBackground, listInactiveSelectionForeground, listInactiveSelectionIconForeground, menuBackground, menuBorder, menuForeground, menuSelectionBackground, menuSelectionBorder, menuSelectionForeground, menuSeparatorBackground, pickerGroupForeground, problemsErrorIconForeground, problemsInfoIconForeground, problemsWarningIconForeground, quickInputListFocusBackground, quickInputListFocusForeground, quickInputListFocusIconForeground, resolveColorValue, scrollbarShadow, scrollbarSliderActiveBackground, scrollbarSliderBackground, scrollbarSliderHoverBackground, selectBackground, selectBorder, selectForeground, selectListBackground, checkboxBackground, checkboxBorder, checkboxForeground, tableColumnsBorder, tableOddRowsBackgroundColor, textLinkForeground, treeIndentGuidesStroke, widgetShadow, listFocusAndSelectionOutline, listFilterWidgetShadow, buttonSeparator } from 'vs/platform/theme/common/colorRegistry'; import { isHighContrast } from 'vs/platform/theme/common/theme'; import { IColorTheme, IThemeService } from 'vs/platform/theme/common/themeService'; @@ -261,15 +261,6 @@ export function attachButtonStyler(widget: IThemable, themeService: IThemeServic buttonBorder: style?.buttonBorder || buttonBorder, } as IButtonStyleOverrides, widget); } -export interface IProgressBarStyleOverrides extends IStyleOverrides { - progressBarBackground?: ColorIdentifier; -} - -export function attachProgressBarStyler(widget: IThemable, themeService: IThemeService, style?: IProgressBarStyleOverrides): IDisposable { - return attachStyler(themeService, { - progressBarBackground: style?.progressBarBackground || progressBarBackground - } as IProgressBarStyleOverrides, widget); -} export function attachStylerCallback(themeService: IThemeService, colors: { [name: string]: ColorIdentifier }, callback: styleFn): IDisposable { return attachStyler(themeService, colors, callback); diff --git a/src/vs/workbench/browser/parts/compositePart.ts b/src/vs/workbench/browser/parts/compositePart.ts index 18a4d42ea90..33abdb3e8f8 100644 --- a/src/vs/workbench/browser/parts/compositePart.ts +++ b/src/vs/workbench/browser/parts/compositePart.ts @@ -24,7 +24,6 @@ import { IProgressIndicator, IEditorProgressService } from 'vs/platform/progress import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IThemeService } from 'vs/platform/theme/common/themeService'; -import { attachProgressBarStyler } from 'vs/platform/theme/common/styler'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { Dimension, append, $, hide, show } from 'vs/base/browser/dom'; import { AnchorAlignment } from 'vs/base/browser/ui/contextview/contextview'; @@ -32,6 +31,7 @@ import { assertIsDefined, withNullAsUndefined } from 'vs/base/common/types'; import { createActionViewItem } from 'vs/platform/actions/browser/menuEntryActionViewItem'; import { AbstractProgressScope, ScopedProgressIndicator } from 'vs/workbench/services/progress/browser/progressIndicator'; import { WorkbenchToolBar } from 'vs/platform/actions/browser/toolbar'; +import { getProgressBarStyles } from 'vs/platform/theme/browser/defaultStyles'; export interface ICompositeTitleLabel { @@ -458,8 +458,7 @@ export abstract class CompositePart extends Part { override createContentArea(parent: HTMLElement): HTMLElement { const contentContainer = append(parent, $('.content')); - this.progressBar = this._register(new ProgressBar(contentContainer)); - this._register(attachProgressBarStyler(this.progressBar, this.themeService)); + this.progressBar = this._register(new ProgressBar(contentContainer, getProgressBarStyles())); this.progressBar.hide(); return contentContainer; diff --git a/src/vs/workbench/browser/parts/editor/editorGroupView.ts b/src/vs/workbench/browser/parts/editor/editorGroupView.ts index 2495583b51f..42574d698a7 100644 --- a/src/vs/workbench/browser/parts/editor/editorGroupView.ts +++ b/src/vs/workbench/browser/parts/editor/editorGroupView.ts @@ -15,7 +15,6 @@ import { Dimension, trackFocus, addDisposableListener, EventType, EventHelper, f import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { ProgressBar } from 'vs/base/browser/ui/progressbar/progressbar'; -import { attachProgressBarStyler } from 'vs/platform/theme/common/styler'; import { IThemeService, registerThemingParticipant, Themable } from 'vs/platform/theme/common/themeService'; import { editorBackground, contrastBorder } from 'vs/platform/theme/common/colorRegistry'; import { EDITOR_GROUP_HEADER_TABS_BACKGROUND, EDITOR_GROUP_HEADER_NO_TABS_BACKGROUND, EDITOR_GROUP_EMPTY_BACKGROUND, EDITOR_GROUP_FOCUSED_EMPTY_BORDER, EDITOR_GROUP_HEADER_BORDER } from 'vs/workbench/common/theme'; @@ -53,6 +52,7 @@ import { URI } from 'vs/base/common/uri'; import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; import { isLinux, isNative, isWindows } from 'vs/base/common/platform'; import { ILogService } from 'vs/platform/log/common/log'; +import { getProgressBarStyles } from 'vs/platform/theme/browser/defaultStyles'; export class EditorGroupView extends Themable implements IEditorGroupView { @@ -182,8 +182,7 @@ export class EditorGroupView extends Themable implements IEditorGroupView { this.element.appendChild(letterpressContainer); // Progress bar - this.progressBar = this._register(new ProgressBar(this.element)); - this._register(attachProgressBarStyler(this.progressBar, this.themeService)); + this.progressBar = this._register(new ProgressBar(this.element, getProgressBarStyles())); this.progressBar.hide(); // Scoped instantiation service diff --git a/src/vs/workbench/browser/parts/notifications/notificationsViewer.ts b/src/vs/workbench/browser/parts/notifications/notificationsViewer.ts index 355de6cf73a..db831090a83 100644 --- a/src/vs/workbench/browser/parts/notifications/notificationsViewer.ts +++ b/src/vs/workbench/browser/parts/notifications/notificationsViewer.ts @@ -9,7 +9,7 @@ import { IOpenerService } from 'vs/platform/opener/common/opener'; import { URI } from 'vs/base/common/uri'; import { localize } from 'vs/nls'; import { ButtonBar, IButtonOptions } from 'vs/base/browser/ui/button/button'; -import { attachButtonStyler, attachProgressBarStyler } from 'vs/platform/theme/common/styler'; +import { attachButtonStyler } from 'vs/platform/theme/common/styler'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar'; import { ActionRunner, IAction, IActionRunner } from 'vs/base/common/actions'; @@ -27,6 +27,7 @@ import { DropdownMenuActionViewItem } from 'vs/base/browser/ui/dropdown/dropdown import { DomEmitter } from 'vs/base/browser/event'; import { Gesture, EventType as GestureEventType } from 'vs/base/browser/touch'; import { Event } from 'vs/base/common/event'; +import { getProgressBarStyles } from 'vs/platform/theme/browser/defaultStyles'; export class NotificationsListDelegate implements IListVirtualDelegate { @@ -181,7 +182,6 @@ export class NotificationRenderer implements IListRenderer(), _notebookEditor); + super(contextViewService, contextKeyService, configurationService, menuService, contextMenuService, instantiationService, new FindReplaceState(), _notebookEditor); this._findModel = new FindModel(this._notebookEditor, this._state, this._configurationService); DOM.append(this._notebookEditor.getDomNode(), this.getDomNode()); diff --git a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellProgressBar.ts b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellProgressBar.ts index b975fe625da..655bffaa72f 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellProgressBar.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellProgressBar.ts @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { ProgressBar } from 'vs/base/browser/ui/progressbar/progressbar'; +import { getProgressBarStyles } from 'vs/platform/theme/browser/defaultStyles'; import { ICellViewModel } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { CellViewModelStateChangeEvent } from 'vs/workbench/contrib/notebook/browser/notebookViewEvents'; import { CellPart } from 'vs/workbench/contrib/notebook/browser/view/cellPart'; @@ -20,10 +21,10 @@ export class CellProgressBar extends CellPart { @INotebookExecutionStateService private readonly _notebookExecutionStateService: INotebookExecutionStateService) { super(); - this._progressBar = this._register(new ProgressBar(editorContainer)); + this._progressBar = this._register(new ProgressBar(editorContainer, getProgressBarStyles())); this._progressBar.hide(); - this._collapsedProgressBar = this._register(new ProgressBar(collapsedInputContainer)); + this._collapsedProgressBar = this._register(new ProgressBar(collapsedInputContainer, getProgressBarStyles())); this._collapsedProgressBar.hide(); } diff --git a/src/vs/workbench/contrib/outline/browser/outlinePane.ts b/src/vs/workbench/contrib/outline/browser/outlinePane.ts index 3ccf2f5c19a..09e74bcd91d 100644 --- a/src/vs/workbench/contrib/outline/browser/outlinePane.ts +++ b/src/vs/workbench/contrib/outline/browser/outlinePane.ts @@ -17,7 +17,6 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { WorkbenchDataTree } from 'vs/platform/list/browser/listService'; import { IStorageService } from 'vs/platform/storage/common/storage'; -import { attachProgressBarStyler } from 'vs/platform/theme/common/styler'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { ViewPane } from 'vs/workbench/browser/parts/views/viewPane'; import { IViewletViewOptions } from 'vs/workbench/browser/parts/views/viewsViewlet'; @@ -36,6 +35,7 @@ import { ITreeSorter } from 'vs/base/browser/ui/tree/tree'; import { AbstractTreeViewState, IAbstractTreeViewState, TreeFindMode } from 'vs/base/browser/ui/tree/abstractTree'; import { URI } from 'vs/base/common/uri'; import { ctxAllCollapsed, ctxFilterOnType, ctxFollowsCursor, ctxSortMode, IOutlinePane, OutlineSortOrder } from 'vs/workbench/contrib/outline/browser/outline'; +import { getProgressBarStyles } from 'vs/platform/theme/browser/defaultStyles'; class OutlineTreeSorter implements ITreeSorter { @@ -85,7 +85,6 @@ export class OutlinePane extends ViewPane implements IOutlinePane { @IOutlineService private readonly _outlineService: IOutlineService, @IInstantiationService private readonly _instantiationService: IInstantiationService, @IViewDescriptorService viewDescriptorService: IViewDescriptorService, - @IThemeService private readonly _themeService: IThemeService, @IStorageService private readonly _storageService: IStorageService, @IEditorService private readonly _editorService: IEditorService, @IConfigurationService configurationService: IConfigurationService, @@ -137,8 +136,7 @@ export class OutlinePane extends ViewPane implements IOutlinePane { const progressContainer = dom.$('.outline-progress'); this._message = dom.$('.outline-message'); - this._progressBar = new ProgressBar(progressContainer); - this._disposables.add(attachProgressBarStyler(this._progressBar, this._themeService)); + this._progressBar = new ProgressBar(progressContainer, getProgressBarStyles()); this._treeContainer = dom.$('.outline-tree'); dom.append(container, progressContainer, this._message, this._treeContainer); From 9fd9f11d1ab9573632d09070aea1069ecca52a83 Mon Sep 17 00:00:00 2001 From: Bhavya Udayashankar Date: Fri, 4 Nov 2022 08:24:48 -0700 Subject: [PATCH 112/185] Also make button focusable --- .../contrib/welcomeGettingStarted/browser/gettingStarted.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.ts b/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.ts index 8bd03690e3e..aacb57a37eb 100644 --- a/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.ts +++ b/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.ts @@ -1293,6 +1293,7 @@ export class GettingStartedPage extends EditorPane { 'data-done-step-id': step.id, 'x-dispatch': 'toggleStepCompletion:' + step.id, 'role': 'checkbox', + 'tabindex': '0', }); const container = $('.step-description-container', { 'x-step-description-for': step.id }); From 5e47d25f80dda7ee83577a5d67b3fd1dfe91675d Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Fri, 4 Nov 2022 17:10:30 +0100 Subject: [PATCH 113/185] Fix typings issues with TestInstantiationService #164297 (#165514) --- .../extensionsActions.test.ts | 84 +++++++++---------- .../electron-browser/extensionsViews.test.ts | 6 +- 2 files changed, 45 insertions(+), 45 deletions(-) diff --git a/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsActions.test.ts b/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsActions.test.ts index bc185062083..174a1796d0f 100644 --- a/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsActions.test.ts +++ b/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsActions.test.ts @@ -330,14 +330,14 @@ suite('ExtensionsActions', () => { }); test('Test UpdateAction when there is no extension', () => { - const testObject: ExtensionsActions.UpdateAction = instantiationService.createInstance(ExtensionsActions.UpdateAction); + const testObject: ExtensionsActions.UpdateAction = instantiationService.createInstance(ExtensionsActions.UpdateAction, false); instantiationService.createInstance(ExtensionContainers, [testObject]); assert.ok(!testObject.enabled); }); test('Test UpdateAction when extension is uninstalled', () => { - const testObject: ExtensionsActions.UpdateAction = instantiationService.createInstance(ExtensionsActions.UpdateAction); + const testObject: ExtensionsActions.UpdateAction = instantiationService.createInstance(ExtensionsActions.UpdateAction, false); instantiationService.createInstance(ExtensionContainers, [testObject]); const gallery = aGalleryExtension('a', { version: '1.0.0' }); instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery)); @@ -349,7 +349,7 @@ suite('ExtensionsActions', () => { }); test('Test UpdateAction when extension is installed and not outdated', () => { - const testObject: ExtensionsActions.UpdateAction = instantiationService.createInstance(ExtensionsActions.UpdateAction); + const testObject: ExtensionsActions.UpdateAction = instantiationService.createInstance(ExtensionsActions.UpdateAction, false); instantiationService.createInstance(ExtensionContainers, [testObject]); const local = aLocalExtension('a', { version: '1.0.0' }); instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]); @@ -364,7 +364,7 @@ suite('ExtensionsActions', () => { }); test('Test UpdateAction when extension is installed outdated and system extension', () => { - const testObject: ExtensionsActions.UpdateAction = instantiationService.createInstance(ExtensionsActions.UpdateAction); + const testObject: ExtensionsActions.UpdateAction = instantiationService.createInstance(ExtensionsActions.UpdateAction, false); instantiationService.createInstance(ExtensionContainers, [testObject]); const local = aLocalExtension('a', { version: '1.0.0' }, { type: ExtensionType.System }); instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]); @@ -379,7 +379,7 @@ suite('ExtensionsActions', () => { }); test('Test UpdateAction when extension is installed outdated and user extension', () => { - const testObject: ExtensionsActions.UpdateAction = instantiationService.createInstance(ExtensionsActions.UpdateAction); + const testObject: ExtensionsActions.UpdateAction = instantiationService.createInstance(ExtensionsActions.UpdateAction, false); instantiationService.createInstance(ExtensionContainers, [testObject]); const local = aLocalExtension('a', { version: '1.0.0' }); instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]); @@ -405,7 +405,7 @@ suite('ExtensionsActions', () => { }); test('Test UpdateAction when extension is installing and outdated and user extension', async () => { - const testObject: ExtensionsActions.UpdateAction = instantiationService.createInstance(ExtensionsActions.UpdateAction); + const testObject: ExtensionsActions.UpdateAction = instantiationService.createInstance(ExtensionsActions.UpdateAction, false); instantiationService.createInstance(ExtensionContainers, [testObject]); const local = aLocalExtension('a', { version: '1.0.0' }); instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]); @@ -1720,7 +1720,7 @@ suite('RemoteInstallAction', () => { instantiationService.set(IExtensionsWorkbenchService, workbenchService); instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: localWorkspaceExtension.identifier }))); - const testObject: ExtensionsActions.InstallAction = instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false); + const testObject = instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false); instantiationService.createInstance(ExtensionContainers, [testObject]); const extensions = await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!); @@ -1746,7 +1746,7 @@ suite('RemoteInstallAction', () => { const gallery = aGalleryExtension('a', { identifier: localWorkspaceExtension.identifier }); instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery)); - const testObject: ExtensionsActions.InstallAction = instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false); + const testObject = instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false); instantiationService.createInstance(ExtensionContainers, [testObject]); const extensions = await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!); @@ -1779,7 +1779,7 @@ suite('RemoteInstallAction', () => { const gallery = aGalleryExtension('a', { identifier: localWorkspaceExtension.identifier }); instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery)); - const testObject: ExtensionsActions.InstallAction = instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false); + const testObject = instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false); instantiationService.createInstance(ExtensionContainers, [testObject]); const extensions = await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!); @@ -1813,7 +1813,7 @@ suite('RemoteInstallAction', () => { const remoteWorkspaceExtension = aLocalExtension('a', { extensionKind: ['workspace'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) }); await instantiationService.get(IWorkbenchExtensionEnablementService).setEnablement([remoteWorkspaceExtension], EnablementState.DisabledGlobally); instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: localWorkspaceExtension.identifier }))); - const testObject: ExtensionsActions.InstallAction = instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false); + const testObject = instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false); instantiationService.createInstance(ExtensionContainers, [testObject]); const extensions = await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!); @@ -1835,7 +1835,7 @@ suite('RemoteInstallAction', () => { await instantiationService.get(IWorkbenchExtensionEnablementService).setEnablement([localWorkspaceExtension], EnablementState.DisabledGlobally); instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: localWorkspaceExtension.identifier }))); - const testObject: ExtensionsActions.InstallAction = instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false); + const testObject = instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false); instantiationService.createInstance(ExtensionContainers, [testObject]); const extensions = await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!); @@ -1857,7 +1857,7 @@ suite('RemoteInstallAction', () => { await instantiationService.get(IWorkbenchExtensionEnablementService).setEnablement([localWorkspaceExtension], EnablementState.DisabledGlobally); instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: localWorkspaceExtension.identifier }))); - const testObject: ExtensionsActions.InstallAction = instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, true); + const testObject = instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, true); instantiationService.createInstance(ExtensionContainers, [testObject]); const extensions = await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!); @@ -1879,7 +1879,7 @@ suite('RemoteInstallAction', () => { await instantiationService.get(IWorkbenchExtensionEnablementService).setEnablement([localWorkspaceExtension], EnablementState.DisabledGlobally); instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: localWorkspaceExtension.identifier }))); - const testObject: ExtensionsActions.InstallAction = instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false); + const testObject = instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false); instantiationService.createInstance(ExtensionContainers, [testObject]); const extensions = await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!); @@ -1897,7 +1897,7 @@ suite('RemoteInstallAction', () => { instantiationService.set(IExtensionsWorkbenchService, workbenchService); instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: localWorkspaceExtension.identifier }))); - const testObject: ExtensionsActions.InstallAction = instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false); + const testObject = instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false); instantiationService.createInstance(ExtensionContainers, [testObject]); await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!); @@ -1914,7 +1914,7 @@ suite('RemoteInstallAction', () => { instantiationService.set(IExtensionsWorkbenchService, workbenchService); instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a'))); - const testObject: ExtensionsActions.InstallAction = instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false); + const testObject = instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false); instantiationService.createInstance(ExtensionContainers, [testObject]); const pager = await workbenchService.queryGallery(CancellationToken.None); @@ -1938,7 +1938,7 @@ suite('RemoteInstallAction', () => { instantiationService.set(IExtensionsWorkbenchService, workbenchService); instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: localWorkspaceExtension.identifier }))); - const testObject: ExtensionsActions.InstallAction = instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false); + const testObject = instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false); instantiationService.createInstance(ExtensionContainers, [testObject]); const extensions = await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!); @@ -1955,7 +1955,7 @@ suite('RemoteInstallAction', () => { const localWorkspaceExtension = aLocalExtension('a', { extensionKind: ['workspace'] }, { location: URI.file(`pub.a`) }); instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [localWorkspaceExtension]); instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: localWorkspaceExtension.identifier }))); - const testObject: ExtensionsActions.InstallAction = instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false); + const testObject = instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false); instantiationService.createInstance(ExtensionContainers, [testObject]); const extensions = await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!); @@ -1977,7 +1977,7 @@ suite('RemoteInstallAction', () => { instantiationService.set(IExtensionsWorkbenchService, workbenchService); instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: localWorkspaceExtension.identifier }))); - const testObject: ExtensionsActions.InstallAction = instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false); + const testObject = instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false); instantiationService.createInstance(ExtensionContainers, [testObject]); const extensions = await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!); @@ -2001,7 +2001,7 @@ suite('RemoteInstallAction', () => { instantiationService.set(IExtensionsWorkbenchService, workbenchService); instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: localWorkspaceExtension.identifier }))); - const testObject: ExtensionsActions.InstallAction = instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false); + const testObject = instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false); instantiationService.createInstance(ExtensionContainers, [testObject]); const extensions = await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!); @@ -2021,7 +2021,7 @@ suite('RemoteInstallAction', () => { instantiationService.set(IExtensionsWorkbenchService, workbenchService); instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: localWorkspaceExtension.identifier }))); - const testObject: ExtensionsActions.InstallAction = instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false); + const testObject = instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false); instantiationService.createInstance(ExtensionContainers, [testObject]); const extensions = await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!); @@ -2040,7 +2040,7 @@ suite('RemoteInstallAction', () => { instantiationService.set(IExtensionsWorkbenchService, workbenchService); instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: localWorkspaceSystemExtension.identifier }))); - const testObject: ExtensionsActions.InstallAction = instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false); + const testObject = instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false); instantiationService.createInstance(ExtensionContainers, [testObject]); const extensions = await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!); @@ -2059,7 +2059,7 @@ suite('RemoteInstallAction', () => { instantiationService.set(IExtensionsWorkbenchService, workbenchService); instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: localUIExtension.identifier }))); - const testObject: ExtensionsActions.InstallAction = instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false); + const testObject = instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false); instantiationService.createInstance(ExtensionContainers, [testObject]); const extensions = await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!); @@ -2079,7 +2079,7 @@ suite('RemoteInstallAction', () => { instantiationService.set(IExtensionsWorkbenchService, workbenchService); instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: localUIExtension.identifier }))); - const testObject: ExtensionsActions.InstallAction = instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false); + const testObject = instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false); instantiationService.createInstance(ExtensionContainers, [testObject]); const extensions = await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!); @@ -2098,7 +2098,7 @@ suite('RemoteInstallAction', () => { instantiationService.set(IExtensionsWorkbenchService, workbenchService); instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: languagePackExtension.identifier }))); - const testObject: ExtensionsActions.InstallAction = instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false); + const testObject = instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false); instantiationService.createInstance(ExtensionContainers, [testObject]); const extensions = await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!); @@ -2121,7 +2121,7 @@ suite('RemoteInstallAction', () => { instantiationService.set(IExtensionsWorkbenchService, workbenchService); instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: languagePackExtension.identifier }))); - const testObject: ExtensionsActions.InstallAction = instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false); + const testObject = instantiationService.createInstance(ExtensionsActions.RemoteInstallAction, false); instantiationService.createInstance(ExtensionContainers, [testObject]); const extensions = await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!); @@ -2150,7 +2150,7 @@ suite('LocalInstallAction', () => { instantiationService.set(IExtensionsWorkbenchService, workbenchService); instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: remoteUIExtension.identifier }))); - const testObject: ExtensionsActions.InstallAction = instantiationService.createInstance(ExtensionsActions.LocalInstallAction); + const testObject = instantiationService.createInstance(ExtensionsActions.LocalInstallAction); instantiationService.createInstance(ExtensionContainers, [testObject]); const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!); @@ -2171,7 +2171,7 @@ suite('LocalInstallAction', () => { instantiationService.set(IExtensionsWorkbenchService, workbenchService); instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: remoteUIExtension.identifier }))); - const testObject: ExtensionsActions.InstallAction = instantiationService.createInstance(ExtensionsActions.LocalInstallAction); + const testObject = instantiationService.createInstance(ExtensionsActions.LocalInstallAction); instantiationService.createInstance(ExtensionContainers, [testObject]); const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!); @@ -2197,7 +2197,7 @@ suite('LocalInstallAction', () => { const gallery = aGalleryExtension('a', { identifier: remoteUIExtension.identifier }); instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery)); - const testObject: ExtensionsActions.InstallAction = instantiationService.createInstance(ExtensionsActions.LocalInstallAction); + const testObject = instantiationService.createInstance(ExtensionsActions.LocalInstallAction); instantiationService.createInstance(ExtensionContainers, [testObject]); const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!); @@ -2230,7 +2230,7 @@ suite('LocalInstallAction', () => { const gallery = aGalleryExtension('a', { identifier: remoteUIExtension.identifier }); instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery)); - const testObject: ExtensionsActions.InstallAction = instantiationService.createInstance(ExtensionsActions.LocalInstallAction); + const testObject = instantiationService.createInstance(ExtensionsActions.LocalInstallAction); instantiationService.createInstance(ExtensionContainers, [testObject]); const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!); @@ -2264,7 +2264,7 @@ suite('LocalInstallAction', () => { const localUIExtension = aLocalExtension('a', { extensionKind: ['ui'] }, { location: URI.file(`pub.a`) }); await instantiationService.get(IWorkbenchExtensionEnablementService).setEnablement([localUIExtension], EnablementState.DisabledGlobally); instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: remoteUIExtension.identifier }))); - const testObject: ExtensionsActions.InstallAction = instantiationService.createInstance(ExtensionsActions.LocalInstallAction); + const testObject = instantiationService.createInstance(ExtensionsActions.LocalInstallAction); instantiationService.createInstance(ExtensionContainers, [testObject]); const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!); @@ -2284,7 +2284,7 @@ suite('LocalInstallAction', () => { instantiationService.set(IExtensionsWorkbenchService, workbenchService); instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: remoteUIExtension.identifier }))); - const testObject: ExtensionsActions.InstallAction = instantiationService.createInstance(ExtensionsActions.LocalInstallAction); + const testObject = instantiationService.createInstance(ExtensionsActions.LocalInstallAction); instantiationService.createInstance(ExtensionContainers, [testObject]); await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!); @@ -2301,7 +2301,7 @@ suite('LocalInstallAction', () => { instantiationService.set(IExtensionsWorkbenchService, workbenchService); instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a'))); - const testObject: ExtensionsActions.InstallAction = instantiationService.createInstance(ExtensionsActions.LocalInstallAction); + const testObject = instantiationService.createInstance(ExtensionsActions.LocalInstallAction); instantiationService.createInstance(ExtensionContainers, [testObject]); const pager = await workbenchService.queryGallery(CancellationToken.None); @@ -2325,7 +2325,7 @@ suite('LocalInstallAction', () => { instantiationService.set(IExtensionsWorkbenchService, workbenchService); instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: remoteUIExtension.identifier }))); - const testObject: ExtensionsActions.InstallAction = instantiationService.createInstance(ExtensionsActions.LocalInstallAction); + const testObject = instantiationService.createInstance(ExtensionsActions.LocalInstallAction); instantiationService.createInstance(ExtensionContainers, [testObject]); const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!); @@ -2345,7 +2345,7 @@ suite('LocalInstallAction', () => { instantiationService.set(IExtensionsWorkbenchService, workbenchService); instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: remoteUIExtension.identifier }))); - const testObject: ExtensionsActions.InstallAction = instantiationService.createInstance(ExtensionsActions.LocalInstallAction); + const testObject = instantiationService.createInstance(ExtensionsActions.LocalInstallAction); instantiationService.createInstance(ExtensionContainers, [testObject]); const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!); @@ -2366,7 +2366,7 @@ suite('LocalInstallAction', () => { instantiationService.set(IExtensionsWorkbenchService, workbenchService); instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: localUIExtension.identifier }))); - const testObject: ExtensionsActions.InstallAction = instantiationService.createInstance(ExtensionsActions.LocalInstallAction); + const testObject = instantiationService.createInstance(ExtensionsActions.LocalInstallAction); instantiationService.createInstance(ExtensionContainers, [testObject]); const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!); @@ -2388,7 +2388,7 @@ suite('LocalInstallAction', () => { instantiationService.set(IExtensionsWorkbenchService, workbenchService); instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: remoteUIExtension.identifier }))); - const testObject: ExtensionsActions.InstallAction = instantiationService.createInstance(ExtensionsActions.LocalInstallAction); + const testObject = instantiationService.createInstance(ExtensionsActions.LocalInstallAction); instantiationService.createInstance(ExtensionContainers, [testObject]); const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!); @@ -2411,7 +2411,7 @@ suite('LocalInstallAction', () => { instantiationService.set(IExtensionsWorkbenchService, workbenchService); instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: remoteUIExtension.identifier }))); - const testObject: ExtensionsActions.InstallAction = instantiationService.createInstance(ExtensionsActions.LocalInstallAction); + const testObject = instantiationService.createInstance(ExtensionsActions.LocalInstallAction); instantiationService.createInstance(ExtensionContainers, [testObject]); const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!); @@ -2430,7 +2430,7 @@ suite('LocalInstallAction', () => { instantiationService.set(IExtensionsWorkbenchService, workbenchService); instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: remoteUISystemExtension.identifier }))); - const testObject: ExtensionsActions.InstallAction = instantiationService.createInstance(ExtensionsActions.LocalInstallAction); + const testObject = instantiationService.createInstance(ExtensionsActions.LocalInstallAction); instantiationService.createInstance(ExtensionContainers, [testObject]); const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!); @@ -2449,7 +2449,7 @@ suite('LocalInstallAction', () => { instantiationService.set(IExtensionsWorkbenchService, workbenchService); instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: remoteWorkspaceExtension.identifier }))); - const testObject: ExtensionsActions.InstallAction = instantiationService.createInstance(ExtensionsActions.LocalInstallAction); + const testObject = instantiationService.createInstance(ExtensionsActions.LocalInstallAction); instantiationService.createInstance(ExtensionContainers, [testObject]); const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!); @@ -2469,7 +2469,7 @@ suite('LocalInstallAction', () => { instantiationService.set(IExtensionsWorkbenchService, workbenchService); instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: localWorkspaceExtension.identifier }))); - const testObject: ExtensionsActions.InstallAction = instantiationService.createInstance(ExtensionsActions.LocalInstallAction); + const testObject = instantiationService.createInstance(ExtensionsActions.LocalInstallAction); instantiationService.createInstance(ExtensionContainers, [testObject]); const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!); @@ -2488,7 +2488,7 @@ suite('LocalInstallAction', () => { instantiationService.set(IExtensionsWorkbenchService, workbenchService); instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: languagePackExtension.identifier }))); - const testObject: ExtensionsActions.InstallAction = instantiationService.createInstance(ExtensionsActions.LocalInstallAction); + const testObject = instantiationService.createInstance(ExtensionsActions.LocalInstallAction); instantiationService.createInstance(ExtensionContainers, [testObject]); const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!); @@ -2511,7 +2511,7 @@ suite('LocalInstallAction', () => { instantiationService.set(IExtensionsWorkbenchService, workbenchService); instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a', { identifier: languagePackExtension.identifier }))); - const testObject: ExtensionsActions.InstallAction = instantiationService.createInstance(ExtensionsActions.LocalInstallAction); + const testObject = instantiationService.createInstance(ExtensionsActions.LocalInstallAction); instantiationService.createInstance(ExtensionContainers, [testObject]); const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!); diff --git a/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsViews.test.ts b/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsViews.test.ts index ef14de7b97c..7ca59a34f57 100644 --- a/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsViews.test.ts +++ b/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsViews.test.ts @@ -198,7 +198,7 @@ suite('ExtensionsViews Tests', () => { await (instantiationService.get(IWorkbenchExtensionEnablementService)).setEnablement([localDisabledLanguage], EnablementState.DisabledGlobally); instantiationService.set(IExtensionsWorkbenchService, instantiationService.createInstance(ExtensionsWorkbenchService)); - testableView = instantiationService.createInstance(ExtensionsListView, {}, {}); + testableView = instantiationService.createInstance(ExtensionsListView, {}, { id: '', title: '' }); }); teardown(() => { @@ -540,7 +540,7 @@ suite('ExtensionsViews Tests', () => { testableView.resetSearchExperiments(); testableView.dispose(); - testableView = instantiationService.createInstance(ExtensionsListView, {}, {}); + testableView = instantiationService.createInstance(ExtensionsListView, {}, { id: '', title: '' }); return testableView.show('search-me').then(result => { const options: IQueryOptions = queryTarget.args[0][0]; @@ -567,7 +567,7 @@ suite('ExtensionsViews Tests', () => { const queryTarget = instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(...realResults)); testableView.dispose(); - testableView = instantiationService.createInstance(ExtensionsListView, {}, {}); + testableView = instantiationService.createInstance(ExtensionsListView, {}, { id: '', title: '' }); return testableView.show('search-me @sort:installs').then(result => { const options: IQueryOptions = queryTarget.args[0][0]; From 452e028048643cc4c14eb0253f876129fda6515a Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Fri, 4 Nov 2022 17:58:38 +0100 Subject: [PATCH 114/185] Comment view filtering: incorrect count (Showing x of y) (#165517) Fixes #165444 --- src/vs/workbench/contrib/comments/browser/commentsView.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/comments/browser/commentsView.ts b/src/vs/workbench/contrib/comments/browser/commentsView.ts index 4f31b2605e4..858a940e5ce 100644 --- a/src/vs/workbench/contrib/comments/browser/commentsView.ts +++ b/src/vs/workbench/contrib/comments/browser/commentsView.ts @@ -98,7 +98,7 @@ export class CommentsPanel extends FilterViewPane implements ICommentsView { this.filter = new Filter(new FilterOptions(this.filterWidget.getFilterText(), this.filters.showResolved, this.filters.showUnresolved)); this._register(this.commentService.onDidSetAllCommentThreads(e => { - this.totalComments = e.commentThreads.length; + this.totalComments += e.commentThreads.length; })); this._register(this.commentService.onDidUpdateCommentThreads(e => { From dd585edf6d170fff488824a21a9dd8ef93e3a9bf Mon Sep 17 00:00:00 2001 From: aamunger Date: Fri, 4 Nov 2022 10:25:50 -0700 Subject: [PATCH 115/185] better error message --- src/vs/workbench/api/browser/mainThreadNotebookEditors.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/api/browser/mainThreadNotebookEditors.ts b/src/vs/workbench/api/browser/mainThreadNotebookEditors.ts index b45855c6c55..0db9edac4d4 100644 --- a/src/vs/workbench/api/browser/mainThreadNotebookEditors.ts +++ b/src/vs/workbench/api/browser/mainThreadNotebookEditors.ts @@ -114,7 +114,7 @@ export class MainThreadNotebookEditors implements MainThreadNotebookEditorsShape if (notebookEditor) { return notebookEditor.getId(); } else { - throw new Error(`Notebook Editor creation failure for document ${resource}`); + throw new Error(`Notebook Editor creation failure for document ${JSON.stringify(resource)}`); } } From ed0fd3c9de95df87e84c2c3a61df73c64a6057c1 Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Fri, 4 Nov 2022 10:30:32 -0700 Subject: [PATCH 116/185] Fix #165410. No css variables defined at root. (#165519) --- .../workbench/contrib/notebook/browser/media/notebook.css | 1 - .../contrib/notebook/browser/notebookEditorWidget.ts | 6 +++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/contrib/notebook/browser/media/notebook.css b/src/vs/workbench/contrib/notebook/browser/media/notebook.css index 00f2ef7f363..e2cb14443b5 100644 --- a/src/vs/workbench/contrib/notebook/browser/media/notebook.css +++ b/src/vs/workbench/contrib/notebook/browser/media/notebook.css @@ -125,7 +125,6 @@ .monaco-workbench .notebookOverlay .output { position: absolute; height: 0px; - font-size: var(--notebook-cell-output-font-size); user-select: text; -webkit-user-select: text; cursor: auto; diff --git a/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts b/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts index a7e51972309..95f0232295a 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts @@ -557,6 +557,7 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditorD insertToolbarPosition, insertToolbarAlignment, fontSize, + outputFontSize, focusIndicatorLeftMargin, focusIndicatorGap } = this._notebookOptions.getLayoutConfiguration(); @@ -571,9 +572,8 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditorD const fontFamily = this._generateFontFamily(); styleSheets.push(` - :root { - --notebook-cell-output-font-size: ${fontSize}px; - --notebook-cell-output-font-family: ${fontFamily}; + .notebook-editor { + --notebook-cell-output-font-size: ${outputFontSize}px; --notebook-cell-input-preview-font-size: ${fontSize}px; --notebook-cell-input-preview-font-family: ${fontFamily}; } From 2d8202551e44b54232a6a373b576d4447a2a4d11 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Fri, 4 Nov 2022 10:46:09 -0700 Subject: [PATCH 117/185] Adopt l10n for configuration-editing (#165521) For #164438 --- extensions/configuration-editing/package.json | 3 +- .../src/configurationEditingMain.ts | 32 ++++----- .../src/extensionsProposals.ts | 6 +- .../src/settingsDocumentHelper.ts | 68 +++++++++---------- extensions/configuration-editing/yarn.lock | 5 -- 5 files changed, 51 insertions(+), 63 deletions(-) diff --git a/extensions/configuration-editing/package.json b/extensions/configuration-editing/package.json index 37a5a9137bb..59978c47dc3 100644 --- a/extensions/configuration-editing/package.json +++ b/extensions/configuration-editing/package.json @@ -20,8 +20,7 @@ "watch": "gulp watch-extension:configuration-editing" }, "dependencies": { - "jsonc-parser": "^2.2.1", - "vscode-nls": "^5.2.0" + "jsonc-parser": "^2.2.1" }, "capabilities": { "virtualWorkspaces": true, diff --git a/extensions/configuration-editing/src/configurationEditingMain.ts b/extensions/configuration-editing/src/configurationEditingMain.ts index 224a57370b4..41399c2194a 100644 --- a/extensions/configuration-editing/src/configurationEditingMain.ts +++ b/extensions/configuration-editing/src/configurationEditingMain.ts @@ -5,10 +5,8 @@ import { getLocation, JSONPath, parse, visit, Location } from 'jsonc-parser'; import * as vscode from 'vscode'; -import * as nls from 'vscode-nls'; import { SettingsDocument } from './settingsDocumentHelper'; import { provideInstalledExtensionProposals } from './extensionsProposals'; -const localize = nls.loadMessageBundle(); export function activate(context: vscode.ExtensionContext): void { //settings.json suggestions @@ -46,21 +44,21 @@ function registerVariableCompletions(pattern: string): vscode.Disposable { } return [ - { label: 'workspaceFolder', detail: localize('workspaceFolder', "The path of the folder opened in VS Code") }, - { label: 'workspaceFolderBasename', detail: localize('workspaceFolderBasename', "The name of the folder opened in VS Code without any slashes (/)") }, - { label: 'relativeFile', detail: localize('relativeFile', "The current opened file relative to ${workspaceFolder}") }, - { label: 'relativeFileDirname', detail: localize('relativeFileDirname', "The current opened file's dirname relative to ${workspaceFolder}") }, - { label: 'file', detail: localize('file', "The current opened file") }, - { label: 'cwd', detail: localize('cwd', "The task runner's current working directory on startup") }, - { label: 'lineNumber', detail: localize('lineNumber', "The current selected line number in the active file") }, - { label: 'selectedText', detail: localize('selectedText', "The current selected text in the active file") }, - { label: 'fileDirname', detail: localize('fileDirname', "The current opened file's dirname") }, - { label: 'fileExtname', detail: localize('fileExtname', "The current opened file's extension") }, - { label: 'fileBasename', detail: localize('fileBasename', "The current opened file's basename") }, - { label: 'fileBasenameNoExtension', detail: localize('fileBasenameNoExtension', "The current opened file's basename with no file extension") }, - { label: 'defaultBuildTask', detail: localize('defaultBuildTask', "The name of the default build task. If there is not a single default build task then a quick pick is shown to choose the build task.") }, - { label: 'pathSeparator', detail: localize('pathSeparator', "The character used by the operating system to separate components in file paths") }, - { label: 'extensionInstallFolder', detail: localize('extensionInstallFolder', "The path where an an extension is installed."), param: 'publisher.extension' }, + { label: 'workspaceFolder', detail: vscode.l10n.t("The path of the folder opened in VS Code") }, + { label: 'workspaceFolderBasename', detail: vscode.l10n.t("The name of the folder opened in VS Code without any slashes (/)") }, + { label: 'relativeFile', detail: vscode.l10n.t("The current opened file relative to ${workspaceFolder}") }, + { label: 'relativeFileDirname', detail: vscode.l10n.t("The current opened file's dirname relative to ${workspaceFolder}") }, + { label: 'file', detail: vscode.l10n.t("The current opened file") }, + { label: 'cwd', detail: vscode.l10n.t("The task runner's current working directory on startup") }, + { label: 'lineNumber', detail: vscode.l10n.t("The current selected line number in the active file") }, + { label: 'selectedText', detail: vscode.l10n.t("The current selected text in the active file") }, + { label: 'fileDirname', detail: vscode.l10n.t("The current opened file's dirname") }, + { label: 'fileExtname', detail: vscode.l10n.t("The current opened file's extension") }, + { label: 'fileBasename', detail: vscode.l10n.t("The current opened file's basename") }, + { label: 'fileBasenameNoExtension', detail: vscode.l10n.t("The current opened file's basename with no file extension") }, + { label: 'defaultBuildTask', detail: vscode.l10n.t("The name of the default build task. If there is not a single default build task then a quick pick is shown to choose the build task.") }, + { label: 'pathSeparator', detail: vscode.l10n.t("The character used by the operating system to separate components in file paths") }, + { label: 'extensionInstallFolder', detail: vscode.l10n.t("The path where an an extension is installed."), param: 'publisher.extension' }, ].map(variable => ({ label: `\${${variable.label}}`, range, diff --git a/extensions/configuration-editing/src/extensionsProposals.ts b/extensions/configuration-editing/src/extensionsProposals.ts index ab648e05f3c..6438281dc0b 100644 --- a/extensions/configuration-editing/src/extensionsProposals.ts +++ b/extensions/configuration-editing/src/extensionsProposals.ts @@ -4,8 +4,6 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; -import * as nls from 'vscode-nls'; -const localize = nls.loadMessageBundle(); export async function provideInstalledExtensionProposals(existing: string[], additionalText: string, range: vscode.Range, includeBuiltinExtensions: boolean): Promise { @@ -23,7 +21,7 @@ export async function provideInstalledExtensionProposals(existing: string[], add return item; }); } else { - const example = new vscode.CompletionItem(localize('exampleExtension', "Example")); + const example = new vscode.CompletionItem(vscode.l10n.t("Example")); example.insertText = '"vscode.csharp"'; example.kind = vscode.CompletionItemKind.Value; example.range = range; @@ -48,7 +46,7 @@ export async function provideWorkspaceTrustExtensionProposals(existing: string[] return item; }); } else { - const example = new vscode.CompletionItem(localize('exampleExtension', "Example")); + const example = new vscode.CompletionItem(vscode.l10n.t("Example")); example.insertText = '"vscode.csharp: {\n\t"supported": false,\n\t"version": "0.0.0"\n}`;"'; example.kind = vscode.CompletionItemKind.Value; example.range = range; diff --git a/extensions/configuration-editing/src/settingsDocumentHelper.ts b/extensions/configuration-editing/src/settingsDocumentHelper.ts index ab41c8220c2..24215b25404 100644 --- a/extensions/configuration-editing/src/settingsDocumentHelper.ts +++ b/extensions/configuration-editing/src/settingsDocumentHelper.ts @@ -5,10 +5,8 @@ import * as vscode from 'vscode'; import { getLocation, Location, parse } from 'jsonc-parser'; -import * as nls from 'vscode-nls'; import { provideInstalledExtensionProposals } from './extensionsProposals'; -const localize = nls.loadMessageBundle(); const OVERRIDE_IDENTIFIER_REGEX = /\[([^\[\]]*)\]/g; export class SettingsDocument { @@ -107,20 +105,20 @@ export class SettingsDocument { }; - completions.push(this.newSimpleCompletionItem(getText('activeEditorShort'), range, localize('activeEditorShort', "the file name (e.g. myFile.txt)"))); - completions.push(this.newSimpleCompletionItem(getText('activeEditorMedium'), range, localize('activeEditorMedium', "the path of the file relative to the workspace folder (e.g. myFolder/myFileFolder/myFile.txt)"))); - completions.push(this.newSimpleCompletionItem(getText('activeEditorLong'), range, localize('activeEditorLong', "the full path of the file (e.g. /Users/Development/myFolder/myFileFolder/myFile.txt)"))); - completions.push(this.newSimpleCompletionItem(getText('activeFolderShort'), range, localize('activeFolderShort', "the name of the folder the file is contained in (e.g. myFileFolder)"))); - completions.push(this.newSimpleCompletionItem(getText('activeFolderMedium'), range, localize('activeFolderMedium', "the path of the folder the file is contained in, relative to the workspace folder (e.g. myFolder/myFileFolder)"))); - completions.push(this.newSimpleCompletionItem(getText('activeFolderLong'), range, localize('activeFolderLong', "the full path of the folder the file is contained in (e.g. /Users/Development/myFolder/myFileFolder)"))); - completions.push(this.newSimpleCompletionItem(getText('rootName'), range, localize('rootName', "name of the workspace (e.g. myFolder or myWorkspace)"))); - completions.push(this.newSimpleCompletionItem(getText('rootPath'), range, localize('rootPath', "file path of the workspace (e.g. /Users/Development/myWorkspace)"))); - completions.push(this.newSimpleCompletionItem(getText('folderName'), range, localize('folderName', "name of the workspace folder the file is contained in (e.g. myFolder)"))); - completions.push(this.newSimpleCompletionItem(getText('folderPath'), range, localize('folderPath', "file path of the workspace folder the file is contained in (e.g. /Users/Development/myFolder)"))); - completions.push(this.newSimpleCompletionItem(getText('appName'), range, localize('appName', "e.g. VS Code"))); - completions.push(this.newSimpleCompletionItem(getText('remoteName'), range, localize('remoteName', "e.g. SSH"))); - completions.push(this.newSimpleCompletionItem(getText('dirty'), range, localize('dirty', "an indicator for when the active editor has unsaved changes"))); - completions.push(this.newSimpleCompletionItem(getText('separator'), range, localize('separator', "a conditional separator (' - ') that only shows when surrounded by variables with values"))); + completions.push(this.newSimpleCompletionItem(getText('activeEditorShort'), range, vscode.l10n.t("the file name (e.g. myFile.txt)"))); + completions.push(this.newSimpleCompletionItem(getText('activeEditorMedium'), range, vscode.l10n.t("the path of the file relative to the workspace folder (e.g. myFolder/myFileFolder/myFile.txt)"))); + completions.push(this.newSimpleCompletionItem(getText('activeEditorLong'), range, vscode.l10n.t("the full path of the file (e.g. /Users/Development/myFolder/myFileFolder/myFile.txt)"))); + completions.push(this.newSimpleCompletionItem(getText('activeFolderShort'), range, vscode.l10n.t("the name of the folder the file is contained in (e.g. myFileFolder)"))); + completions.push(this.newSimpleCompletionItem(getText('activeFolderMedium'), range, vscode.l10n.t("the path of the folder the file is contained in, relative to the workspace folder (e.g. myFolder/myFileFolder)"))); + completions.push(this.newSimpleCompletionItem(getText('activeFolderLong'), range, vscode.l10n.t("the full path of the folder the file is contained in (e.g. /Users/Development/myFolder/myFileFolder)"))); + completions.push(this.newSimpleCompletionItem(getText('rootName'), range, vscode.l10n.t("name of the workspace (e.g. myFolder or myWorkspace)"))); + completions.push(this.newSimpleCompletionItem(getText('rootPath'), range, vscode.l10n.t("file path of the workspace (e.g. /Users/Development/myWorkspace)"))); + completions.push(this.newSimpleCompletionItem(getText('folderName'), range, vscode.l10n.t("name of the workspace folder the file is contained in (e.g. myFolder)"))); + completions.push(this.newSimpleCompletionItem(getText('folderPath'), range, vscode.l10n.t("file path of the workspace folder the file is contained in (e.g. /Users/Development/myFolder)"))); + completions.push(this.newSimpleCompletionItem(getText('appName'), range, vscode.l10n.t("e.g. VS Code"))); + completions.push(this.newSimpleCompletionItem(getText('remoteName'), range, vscode.l10n.t("e.g. SSH"))); + completions.push(this.newSimpleCompletionItem(getText('dirty'), range, vscode.l10n.t("an indicator for when the active editor has unsaved changes"))); + completions.push(this.newSimpleCompletionItem(getText('separator'), range, vscode.l10n.t("a conditional separator (' - ') that only shows when surrounded by variables with values"))); return completions; } @@ -134,15 +132,15 @@ export class SettingsDocument { const range = this.getReplaceRange(location, position); completions.push(this.newSnippetCompletionItem({ - label: localize('assocLabelFile', "Files with Extension"), - documentation: localize('assocDescriptionFile', "Map all files matching the glob pattern in their filename to the language with the given identifier."), + label: vscode.l10n.t("Files with Extension"), + documentation: vscode.l10n.t("Map all files matching the glob pattern in their filename to the language with the given identifier."), snippet: location.isAtPropertyKey ? '"*.${1:extension}": "${2:language}"' : '{ "*.${1:extension}": "${2:language}" }', range })); completions.push(this.newSnippetCompletionItem({ - label: localize('assocLabelPath', "Files with Path"), - documentation: localize('assocDescriptionPath', "Map all files matching the absolute path glob pattern in their path to the language with the given identifier."), + label: vscode.l10n.t("Files with Path"), + documentation: vscode.l10n.t("Map all files matching the absolute path glob pattern in their path to the language with the given identifier."), snippet: location.isAtPropertyKey ? '"/${1:path to file}/*.${2:extension}": "${3:language}"' : '{ "/${1:path to file}/*.${2:extension}": "${3:language}" }', range })); @@ -163,43 +161,43 @@ export class SettingsDocument { const range = this.getReplaceRange(location, position); completions.push(this.newSnippetCompletionItem({ - label: localize('fileLabel', "Files by Extension"), - documentation: localize('fileDescription', "Match all files of a specific file extension."), + label: vscode.l10n.t("Files by Extension"), + documentation: vscode.l10n.t("Match all files of a specific file extension."), snippet: location.path.length === 2 ? '"**/*.${1:extension}": true' : '{ "**/*.${1:extension}": true }', range })); completions.push(this.newSnippetCompletionItem({ - label: localize('filesLabel', "Files with Multiple Extensions"), - documentation: localize('filesDescription', "Match all files with any of the file extensions."), + label: vscode.l10n.t("Files with Multiple Extensions"), + documentation: vscode.l10n.t("Match all files with any of the file extensions."), snippet: location.path.length === 2 ? '"**/*.{ext1,ext2,ext3}": true' : '{ "**/*.{ext1,ext2,ext3}": true }', range })); completions.push(this.newSnippetCompletionItem({ - label: localize('derivedLabel', "Files with Siblings by Name"), - documentation: localize('derivedDescription', "Match files that have siblings with the same name but a different extension."), + label: vscode.l10n.t("Files with Siblings by Name"), + documentation: vscode.l10n.t("Match files that have siblings with the same name but a different extension."), snippet: location.path.length === 2 ? '"**/*.${1:source-extension}": { "when": "$(basename).${2:target-extension}" }' : '{ "**/*.${1:source-extension}": { "when": "$(basename).${2:target-extension}" } }', range })); completions.push(this.newSnippetCompletionItem({ - label: localize('topFolderLabel', "Folder by Name (Top Level)"), - documentation: localize('topFolderDescription', "Match a top level folder with a specific name."), + label: vscode.l10n.t("Folder by Name (Top Level)"), + documentation: vscode.l10n.t("Match a top level folder with a specific name."), snippet: location.path.length === 2 ? '"${1:name}": true' : '{ "${1:name}": true }', range })); completions.push(this.newSnippetCompletionItem({ - label: localize('topFoldersLabel', "Folders with Multiple Names (Top Level)"), - documentation: localize('topFoldersDescription', "Match multiple top level folders."), + label: vscode.l10n.t("Folders with Multiple Names (Top Level)"), + documentation: vscode.l10n.t("Match multiple top level folders."), snippet: location.path.length === 2 ? '"{folder1,folder2,folder3}": true' : '{ "{folder1,folder2,folder3}": true }', range })); completions.push(this.newSnippetCompletionItem({ - label: localize('folderLabel', "Folder by Name (Any Location)"), - documentation: localize('folderDescription', "Match a folder with a specific name in any location."), + label: vscode.l10n.t("Folder by Name (Any Location)"), + documentation: vscode.l10n.t("Match a folder with a specific name in any location."), snippet: location.path.length === 2 ? '"**/${1:name}": true' : '{ "**/${1:name}": true }', range })); @@ -209,8 +207,8 @@ export class SettingsDocument { else if (location.path.length === 2 && this.isCompletingPropertyValue(location, position)) { const range = this.getReplaceRange(location, position); completions.push(this.newSnippetCompletionItem({ - label: localize('derivedLabel', "Files with Siblings by Name"), - documentation: localize('siblingsDescription', "Match files that have siblings with the same name but a different extension."), + label: vscode.l10n.t("Files with Siblings by Name"), + documentation: vscode.l10n.t("Match files that have siblings with the same name but a different extension."), snippet: '{ "when": "$(basename).${1:extension}" }', range })); @@ -224,7 +222,7 @@ export class SettingsDocument { const range = this.getReplaceRange(location, position); const languages = await vscode.languages.getLanguages(); return [ - this.newSimpleCompletionItem(JSON.stringify('${activeEditorLanguage}'), range, localize('activeEditor', "Use the language of the currently active text editor if any")), + this.newSimpleCompletionItem(JSON.stringify('${activeEditorLanguage}'), range, vscode.l10n.t("Use the language of the currently active text editor if any")), ...languages.map(l => this.newSimpleCompletionItem(JSON.stringify(l), range)) ]; } diff --git a/extensions/configuration-editing/yarn.lock b/extensions/configuration-editing/yarn.lock index 5bb8132d373..9c9c6191db9 100644 --- a/extensions/configuration-editing/yarn.lock +++ b/extensions/configuration-editing/yarn.lock @@ -11,8 +11,3 @@ jsonc-parser@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-2.2.1.tgz#db73cd59d78cce28723199466b2a03d1be1df2bc" integrity sha512-o6/yDBYccGvTz1+QFevz6l6OBZ2+fMVu2JZ9CIhzsYRX4mjaK5IyX9eldUdCmga16zlgQxyrj5pt9kzuj2C02w== - -vscode-nls@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-5.2.0.tgz#3cb6893dd9bd695244d8a024bdf746eea665cc3f" - integrity sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng== From eafc1e0fe1a9576b751a4af8f37885b62cd67a7a Mon Sep 17 00:00:00 2001 From: Logan Ramos Date: Fri, 4 Nov 2022 13:47:35 -0400 Subject: [PATCH 118/185] Remove overzealous telemetry (#165524) --- extensions/git/src/git.ts | 18 +--------------- extensions/git/src/main.ts | 2 +- .../contextkey/browser/contextKeyService.ts | 21 ------------------- 3 files changed, 2 insertions(+), 39 deletions(-) diff --git a/extensions/git/src/git.ts b/extensions/git/src/git.ts index 7c49b545f8c..368180965ac 100644 --- a/extensions/git/src/git.ts +++ b/extensions/git/src/git.ts @@ -18,7 +18,6 @@ import { detectEncoding } from './encoding'; import { Ref, RefType, Branch, Remote, ForcePushMode, GitErrorCodes, LogOptions, Change, Status, CommitOptions, BranchQuery } from './api/git'; import * as byline from 'byline'; import { StringDecoder } from 'string_decoder'; -import TelemetryReporter from '@vscode/extension-telemetry'; // https://github.com/microsoft/vscode/issues/65693 const MAX_CLI_LENGTH = 30000; @@ -375,14 +374,11 @@ export class Git { private _onOutput = new EventEmitter(); get onOutput(): EventEmitter { return this._onOutput; } - private readonly telemetryReporter: TelemetryReporter; - - constructor(options: IGitOptions, telemetryReporter: TelemetryReporter) { + constructor(options: IGitOptions) { this.path = options.gitPath; this.version = options.version; this.userAgent = options.userAgent; this.env = options.env || {}; - this.telemetryReporter = telemetryReporter; const onConfigurationChanged = (e?: ConfigurationChangeEvent) => { if (e !== undefined && !e.affectsConfiguration('git.commandsToLog')) { @@ -563,9 +559,7 @@ export class Git { } private async _exec(args: string[], options: SpawnOptions = {}): Promise> { - const startSpawn = Date.now(); const child = this.spawn(args, options); - const durSpawn = Date.now() - startSpawn; options.onSpawn?.(child); @@ -592,16 +586,6 @@ export class Git { } } - /* __GDPR__ - "git.execDuration" : { - "owner": "lszomoru", - "comment": "Time it takes to spawn and execute a git command", - "durSpawn": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth","isMeasurement": true, "comment": "Time it took to run spawn git" }, - "durExec": { "classification": "SystemMetaData", "purpose": "PerformanceAndHealth","isMeasurement": true, "comment": "Time git took" } - } - */ - this.telemetryReporter.sendTelemetryEvent('git.execDuration', undefined, { durSpawn, durExec }); - let encoding = options.encoding || 'utf8'; encoding = iconv.encodingExists(encoding) ? encoding : 'utf8'; diff --git a/extensions/git/src/main.ts b/extensions/git/src/main.ts index 54faa7aa0f8..d71e30f433a 100644 --- a/extensions/git/src/main.ts +++ b/extensions/git/src/main.ts @@ -85,7 +85,7 @@ async function createModel(context: ExtensionContext, logger: LogOutputChannel, userAgent: `git/${info.version} (${(os as any).version?.() ?? os.type()} ${os.release()}; ${os.platform()} ${os.arch()}) vscode/${vscodeVersion} (${env.appName})`, version: info.version, env: environment, - }, telemetryReporter); + }); const model = new Model(git, askpass, context.globalState, logger, telemetryReporter); disposables.push(model); diff --git a/src/vs/platform/contextkey/browser/contextKeyService.ts b/src/vs/platform/contextkey/browser/contextKeyService.ts index 8d3890d171c..d5597a913cf 100644 --- a/src/vs/platform/contextkey/browser/contextKeyService.ts +++ b/src/vs/platform/contextkey/browser/contextKeyService.ts @@ -9,7 +9,6 @@ import { DisposableStore, IDisposable, MutableDisposable } from 'vs/base/common/ import { MarshalledObject } from 'vs/base/common/marshalling'; import { MarshalledId } from 'vs/base/common/marshallingIds'; import { cloneAndChange, distinct } from 'vs/base/common/objects'; -import { StopWatch } from 'vs/base/common/stopwatch'; import { TernarySearchTree } from 'vs/base/common/ternarySearchTree'; import { URI } from 'vs/base/common/uri'; import { localize } from 'vs/nls'; @@ -17,7 +16,6 @@ import { CommandsRegistry } from 'vs/platform/commands/common/commands'; import { ConfigurationTarget, IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { ContextKeyExpression, ContextKeyInfo, ContextKeyValue, IContext, IContextKey, IContextKeyChangeEvent, IContextKeyService, IContextKeyServiceTarget, IReadableSet, RawContextKey, SET_CONTEXT_COMMAND_ID } from 'vs/platform/contextkey/common/contextkey'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; -import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; const KEYBINDING_CONTEXT_ATTR = 'data-keybinding-context'; @@ -606,26 +604,7 @@ function findContextAttr(domNode: IContextKeyServiceTarget | null): number { export function setContext(accessor: ServicesAccessor, contextKey: any, contextValue: any) { const contextKeyService = accessor.get(IContextKeyService); - const telemetryService = accessor.get(ITelemetryService); - - const sw = new StopWatch(true); contextKeyService.createKey(String(contextKey), stringifyURIs(contextValue)); - const duration = sw.elapsed(); - - type TelemetryData = { - duration: number; - contextKey: string; - }; - type TelemetryClassification = { - owner: 'jrieken'; - comment: 'Performance numbers of the setContext-API command'; - duration: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth'; isMeasurement: true; comment: 'The time it took to set the context key' }; - contextKey: { classification: 'SystemMetaData'; purpose: 'PerformanceAndHealth'; comment: 'The context key that got set' }; - }; - telemetryService.publicLog2('command.setContext', { - contextKey: String(contextKey), - duration - }); } function stringifyURIs(contextValue: any): any { From 10dc1a34b57441fb5b5649906b2d0a9c4e3d29fd Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Fri, 4 Nov 2022 10:57:02 -0700 Subject: [PATCH 119/185] Adopt l10n for media-preview (#165525) For #164438 --- extensions/media-preview/package.json | 3 +-- extensions/media-preview/src/audioPreview.ts | 7 ++----- .../media-preview/src/binarySizeStatusBarEntry.ts | 14 ++++++-------- extensions/media-preview/src/imagePreview/index.ts | 6 ++---- .../src/imagePreview/sizeStatusBarEntry.ts | 4 +--- .../src/imagePreview/zoomStatusBarEntry.ts | 8 +++----- extensions/media-preview/src/videoPreview.ts | 6 ++---- extensions/media-preview/yarn.lock | 5 ----- 8 files changed, 17 insertions(+), 36 deletions(-) diff --git a/extensions/media-preview/package.json b/extensions/media-preview/package.json index 384ab75f58b..598c4ad1358 100644 --- a/extensions/media-preview/package.json +++ b/extensions/media-preview/package.json @@ -101,8 +101,7 @@ "watch-web": "npx webpack-cli --config extension-browser.webpack.config --mode none --watch --info-verbosity verbose" }, "dependencies": { - "@vscode/extension-telemetry": "0.6.2", - "vscode-nls": "^5.2.0" + "@vscode/extension-telemetry": "0.6.2" }, "repository": { "type": "git", diff --git a/extensions/media-preview/src/audioPreview.ts b/extensions/media-preview/src/audioPreview.ts index 2769ae3cbfb..9e2670cddad 100644 --- a/extensions/media-preview/src/audioPreview.ts +++ b/extensions/media-preview/src/audioPreview.ts @@ -4,13 +4,10 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; -import * as nls from 'vscode-nls'; import { BinarySizeStatusBarEntry } from './binarySizeStatusBarEntry'; import { MediaPreview, reopenAsText } from './mediaPreview'; import { escapeAttribute, getNonce } from './util/dom'; -const localize = nls.loadMessageBundle(); - class AudioPreviewProvider implements vscode.CustomReadonlyEditorProvider { public static readonly viewType = 'vscode.audioPreview'; @@ -82,8 +79,8 @@ class AudioPreview extends MediaPreview {
-

${localize('preview.audioLoadError', "An error occurred while loading the audio file.")}

- ${localize('preview.audioLoadErrorLink', "Open file using VS Code's standard text/binary editor?")} +

${vscode.l10n.t("An error occurred while loading the audio file.")}

+ ${vscode.l10n.t("Open file using VS Code's standard text/binary editor?")}
diff --git a/extensions/media-preview/src/binarySizeStatusBarEntry.ts b/extensions/media-preview/src/binarySizeStatusBarEntry.ts index da41ccfe5e5..af34bf8787e 100644 --- a/extensions/media-preview/src/binarySizeStatusBarEntry.ts +++ b/extensions/media-preview/src/binarySizeStatusBarEntry.ts @@ -4,10 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; -import * as nls from 'vscode-nls'; import { PreviewStatusBarEntry } from './ownedStatusBarEntry'; -const localize = nls.loadMessageBundle(); class BinarySize { static readonly KB = 1024; @@ -17,29 +15,29 @@ class BinarySize { static formatSize(size: number): string { if (size < BinarySize.KB) { - return localize('sizeB', "{0}B", size); + return vscode.l10n.t("{0}B", size); } if (size < BinarySize.MB) { - return localize('sizeKB', "{0}KB", (size / BinarySize.KB).toFixed(2)); + return vscode.l10n.t("{0}KB", (size / BinarySize.KB).toFixed(2)); } if (size < BinarySize.GB) { - return localize('sizeMB', "{0}MB", (size / BinarySize.MB).toFixed(2)); + return vscode.l10n.t("{0}MB", (size / BinarySize.MB).toFixed(2)); } if (size < BinarySize.TB) { - return localize('sizeGB', "{0}GB", (size / BinarySize.GB).toFixed(2)); + return vscode.l10n.t("{0}GB", (size / BinarySize.GB).toFixed(2)); } - return localize('sizeTB', "{0}TB", (size / BinarySize.TB).toFixed(2)); + return vscode.l10n.t("{0}TB", (size / BinarySize.TB).toFixed(2)); } } export class BinarySizeStatusBarEntry extends PreviewStatusBarEntry { constructor() { - super('status.imagePreview.binarySize', localize('sizeStatusBar.name', "Image Binary Size"), vscode.StatusBarAlignment.Right, 100); + super('status.imagePreview.binarySize', vscode.l10n.t("Image Binary Size"), vscode.StatusBarAlignment.Right, 100); } public show(owner: unknown, size: number | undefined) { diff --git a/extensions/media-preview/src/imagePreview/index.ts b/extensions/media-preview/src/imagePreview/index.ts index 5c0d56933ba..f62f6699a2a 100644 --- a/extensions/media-preview/src/imagePreview/index.ts +++ b/extensions/media-preview/src/imagePreview/index.ts @@ -4,14 +4,12 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; -import * as nls from 'vscode-nls'; import { BinarySizeStatusBarEntry } from '../binarySizeStatusBarEntry'; import { MediaPreview, PreviewState, reopenAsText } from '../mediaPreview'; import { escapeAttribute, getNonce } from '../util/dom'; import { SizeStatusBarEntry } from './sizeStatusBarEntry'; import { Scale, ZoomStatusBarEntry } from './zoomStatusBarEntry'; -const localize = nls.loadMessageBundle(); export class PreviewManager implements vscode.CustomReadonlyEditorProvider { @@ -181,8 +179,8 @@ class ImagePreview extends MediaPreview {
-

${localize('preview.imageLoadError', "An error occurred while loading the image.")}

- ${localize('preview.imageLoadErrorLink', "Open file using VS Code's standard text/binary editor?")} +

${vscode.l10n.t("An error occurred while loading the image.")}

+ ${vscode.l10n.t("Open file using VS Code's standard text/binary editor?")}
diff --git a/extensions/media-preview/src/imagePreview/sizeStatusBarEntry.ts b/extensions/media-preview/src/imagePreview/sizeStatusBarEntry.ts index 397a2ffd97a..cdd3b15c76e 100644 --- a/extensions/media-preview/src/imagePreview/sizeStatusBarEntry.ts +++ b/extensions/media-preview/src/imagePreview/sizeStatusBarEntry.ts @@ -4,15 +4,13 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; -import * as nls from 'vscode-nls'; import { PreviewStatusBarEntry } from '../ownedStatusBarEntry'; -const localize = nls.loadMessageBundle(); export class SizeStatusBarEntry extends PreviewStatusBarEntry { constructor() { - super('status.imagePreview.size', localize('sizeStatusBar.name', "Image Size"), vscode.StatusBarAlignment.Right, 101 /* to the left of editor status (100) */); + super('status.imagePreview.size', vscode.l10n.t("Image Size"), vscode.StatusBarAlignment.Right, 101 /* to the left of editor status (100) */); } public show(owner: unknown, text: string) { diff --git a/extensions/media-preview/src/imagePreview/zoomStatusBarEntry.ts b/extensions/media-preview/src/imagePreview/zoomStatusBarEntry.ts index de0729bebf1..84c4f00c507 100644 --- a/extensions/media-preview/src/imagePreview/zoomStatusBarEntry.ts +++ b/extensions/media-preview/src/imagePreview/zoomStatusBarEntry.ts @@ -4,10 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; -import * as nls from 'vscode-nls'; import { PreviewStatusBarEntry as OwnedStatusBarEntry } from '../ownedStatusBarEntry'; -const localize = nls.loadMessageBundle(); const selectZoomLevelCommandId = '_imagePreview.selectZoomLevel'; @@ -19,7 +17,7 @@ export class ZoomStatusBarEntry extends OwnedStatusBarEntry { public readonly onDidChangeScale = this._onDidChangeScale.event; constructor() { - super('status.imagePreview.zoom', localize('zoomStatusBar.name', "Image Zoom"), vscode.StatusBarAlignment.Right, 102 /* to the left of editor size entry (101) */); + super('status.imagePreview.zoom', vscode.l10n.t("Image Zoom"), vscode.StatusBarAlignment.Right, 102 /* to the left of editor size entry (101) */); this._register(vscode.commands.registerCommand(selectZoomLevelCommandId, async () => { type MyPickItem = vscode.QuickPickItem & { scale: Scale }; @@ -31,7 +29,7 @@ export class ZoomStatusBarEntry extends OwnedStatusBarEntry { })); const pick = await vscode.window.showQuickPick(options, { - placeHolder: localize('zoomStatusBar.placeholder', "Select zoom level") + placeHolder: vscode.l10n.t("Select zoom level") }); if (pick) { this._onDidChangeScale.fire({ scale: pick.scale }); @@ -47,7 +45,7 @@ export class ZoomStatusBarEntry extends OwnedStatusBarEntry { private zoomLabel(scale: Scale): string { return scale === 'fit' - ? localize('zoomStatusBar.wholeImageLabel', "Whole Image") + ? vscode.l10n.t("Whole Image") : `${Math.round(scale * 100)}%`; } } diff --git a/extensions/media-preview/src/videoPreview.ts b/extensions/media-preview/src/videoPreview.ts index 8dae5ec7b67..092d9b96751 100644 --- a/extensions/media-preview/src/videoPreview.ts +++ b/extensions/media-preview/src/videoPreview.ts @@ -4,12 +4,10 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; -import * as nls from 'vscode-nls'; import { BinarySizeStatusBarEntry } from './binarySizeStatusBarEntry'; import { MediaPreview, reopenAsText } from './mediaPreview'; import { escapeAttribute, getNonce } from './util/dom'; -const localize = nls.loadMessageBundle(); class VideoPreviewProvider implements vscode.CustomReadonlyEditorProvider { @@ -82,8 +80,8 @@ class VideoPreview extends MediaPreview {
-

${localize('preview.videoLoadError', "An error occurred while loading the video file.")}

- ${localize('preview.videoLoadErrorLink', "Open file using VS Code's standard text/binary editor?")} +

${vscode.l10n.t("An error occurred while loading the video file.")}

+ ${vscode.l10n.t("Open file using VS Code's standard text/binary editor?")}
diff --git a/extensions/media-preview/yarn.lock b/extensions/media-preview/yarn.lock index a9af1f07de4..fdc91f61070 100644 --- a/extensions/media-preview/yarn.lock +++ b/extensions/media-preview/yarn.lock @@ -45,8 +45,3 @@ dependencies: "@microsoft/1ds-core-js" "^3.2.3" "@microsoft/1ds-post-js" "^3.2.3" - -vscode-nls@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-5.2.0.tgz#3cb6893dd9bd695244d8a024bdf746eea665cc3f" - integrity sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng== From 3ca015cebdce232e4eb800e340e25a5e77b7e20e Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Fri, 4 Nov 2022 11:15:23 -0700 Subject: [PATCH 120/185] Adopt l10n for simple-browser (#165529) For #164438 --- extensions/simple-browser/package.json | 3 +-- extensions/simple-browser/src/extension.ts | 9 +++------ extensions/simple-browser/src/simpleBrowserView.ts | 14 ++++++-------- extensions/simple-browser/yarn.lock | 5 ----- 4 files changed, 10 insertions(+), 21 deletions(-) diff --git a/extensions/simple-browser/package.json b/extensions/simple-browser/package.json index bcd83d483d3..bfb949031f9 100644 --- a/extensions/simple-browser/package.json +++ b/extensions/simple-browser/package.json @@ -67,8 +67,7 @@ "watch-web": "npx webpack-cli --config extension-browser.webpack.config --mode none --watch --info-verbosity verbose" }, "dependencies": { - "@vscode/extension-telemetry": "0.6.2", - "vscode-nls": "^5.2.0" + "@vscode/extension-telemetry": "0.6.2" }, "devDependencies": { "@types/vscode-webview": "^1.57.0", diff --git a/extensions/simple-browser/src/extension.ts b/extensions/simple-browser/src/extension.ts index 6d3ded5131b..576029578f2 100644 --- a/extensions/simple-browser/src/extension.ts +++ b/extensions/simple-browser/src/extension.ts @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; -import * as nls from 'vscode-nls'; import { SimpleBrowserManager } from './simpleBrowserManager'; import { SimpleBrowserView } from './simpleBrowserView'; @@ -13,8 +12,6 @@ declare class URL { hostname: string; } -const localize = nls.loadMessageBundle(); - const openApiCommand = 'simpleBrowser.api.open'; const showCommand = 'simpleBrowser.show'; @@ -48,8 +45,8 @@ export function activate(context: vscode.ExtensionContext) { context.subscriptions.push(vscode.commands.registerCommand(showCommand, async (url?: string) => { if (!url) { url = await vscode.window.showInputBox({ - placeHolder: localize('simpleBrowser.show.placeholder', "https://example.com"), - prompt: localize('simpleBrowser.show.prompt', "Enter url to visit") + placeHolder: vscode.l10n.t("https://example.com"), + prompt: vscode.l10n.t("Enter url to visit") }); } @@ -84,7 +81,7 @@ export function activate(context: vscode.ExtensionContext) { } }, { schemes: ['http', 'https'], - label: localize('openTitle', "Open in simple browser"), + label: vscode.l10n.t("Open in simple browser"), })); } diff --git a/extensions/simple-browser/src/simpleBrowserView.ts b/extensions/simple-browser/src/simpleBrowserView.ts index c5d8a68184e..ca1953be725 100644 --- a/extensions/simple-browser/src/simpleBrowserView.ts +++ b/extensions/simple-browser/src/simpleBrowserView.ts @@ -4,10 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; -import * as nls from 'vscode-nls'; import { Disposable } from './dispose'; -const localize = nls.loadMessageBundle(); export interface ShowOptions { readonly preserveFocus?: boolean; @@ -17,7 +15,7 @@ export interface ShowOptions { export class SimpleBrowserView extends Disposable { public static readonly viewType = 'simpleBrowser.view'; - private static readonly title = localize('view.title', "Simple Browser"); + private static readonly title = vscode.l10n.t("Simple Browser"); private readonly _webviewPanel: vscode.WebviewPanel; @@ -134,15 +132,15 @@ export class SimpleBrowserView extends Disposable {
@@ -150,12 +148,12 @@ export class SimpleBrowserView extends Disposable {
-
${localize('view.iframe-focused', "Focus Lock")}
+
${vscode.l10n.t("Focus Lock")}
diff --git a/extensions/simple-browser/yarn.lock b/extensions/simple-browser/yarn.lock index 97902582dea..ee9f4895bed 100644 --- a/extensions/simple-browser/yarn.lock +++ b/extensions/simple-browser/yarn.lock @@ -55,8 +55,3 @@ vscode-codicons@^0.0.14: version "0.0.14" resolved "https://registry.yarnpkg.com/vscode-codicons/-/vscode-codicons-0.0.14.tgz#e0d05418e2e195564ff6f6a2199d70415911c18f" integrity sha512-6CEH5KT9ct5WMw7n5dlX7rB8ya4CUI2FSq1Wk36XaW+c5RglFtAanUV0T+gvZVVFhl/WxfjTvFHq06Hz9c1SLA== - -vscode-nls@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-5.2.0.tgz#3cb6893dd9bd695244d8a024bdf746eea665cc3f" - integrity sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng== From cdc521af16e7791e0968016ef3fd9a5d3249750b Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Fri, 4 Nov 2022 11:26:04 -0700 Subject: [PATCH 121/185] Adopt l10n for merge-conflict (#165531) For #164438 --- extensions/merge-conflict/package.json | 4 +--- .../merge-conflict/src/codelensProvider.ts | 10 ++++----- .../merge-conflict/src/commandHandler.ts | 22 +++++++++---------- .../merge-conflict/src/mergeDecorator.ts | 7 +++--- extensions/merge-conflict/yarn.lock | 5 ----- 5 files changed, 18 insertions(+), 30 deletions(-) diff --git a/extensions/merge-conflict/package.json b/extensions/merge-conflict/package.json index caba136ce52..afa226bf694 100644 --- a/extensions/merge-conflict/package.json +++ b/extensions/merge-conflict/package.json @@ -165,9 +165,7 @@ } } }, - "dependencies": { - "vscode-nls": "^5.2.0" - }, + "dependencies": {}, "devDependencies": { "@types/node": "16.x" }, diff --git a/extensions/merge-conflict/src/codelensProvider.ts b/extensions/merge-conflict/src/codelensProvider.ts index da82a57ac80..391c737a606 100644 --- a/extensions/merge-conflict/src/codelensProvider.ts +++ b/extensions/merge-conflict/src/codelensProvider.ts @@ -5,8 +5,6 @@ import * as vscode from 'vscode'; import * as interfaces from './interfaces'; -import { loadMessageBundle } from 'vscode-nls'; -const localize = loadMessageBundle(); export default class MergeConflictCodeLensProvider implements vscode.CodeLensProvider, vscode.Disposable { private codeLensRegistrationHandle?: vscode.Disposable | null; @@ -65,25 +63,25 @@ export default class MergeConflictCodeLensProvider implements vscode.CodeLensPro conflicts.forEach(conflict => { const acceptCurrentCommand: vscode.Command = { command: 'merge-conflict.accept.current', - title: localize('acceptCurrentChange', 'Accept Current Change'), + title: vscode.l10n.t("Accept Current Change"), arguments: ['known-conflict', conflict] }; const acceptIncomingCommand: vscode.Command = { command: 'merge-conflict.accept.incoming', - title: localize('acceptIncomingChange', 'Accept Incoming Change'), + title: vscode.l10n.t("Accept Incoming Change"), arguments: ['known-conflict', conflict] }; const acceptBothCommand: vscode.Command = { command: 'merge-conflict.accept.both', - title: localize('acceptBothChanges', 'Accept Both Changes'), + title: vscode.l10n.t("Accept Both Changes"), arguments: ['known-conflict', conflict] }; const diffCommand: vscode.Command = { command: 'merge-conflict.compare', - title: localize('compareChanges', 'Compare Changes'), + title: vscode.l10n.t("Compare Changes"), arguments: [conflict] }; diff --git a/extensions/merge-conflict/src/commandHandler.ts b/extensions/merge-conflict/src/commandHandler.ts index 920875ed6ac..a2b940b24c6 100644 --- a/extensions/merge-conflict/src/commandHandler.ts +++ b/extensions/merge-conflict/src/commandHandler.ts @@ -5,8 +5,6 @@ import * as vscode from 'vscode'; import * as interfaces from './interfaces'; import ContentProvider from './contentProvider'; -import { loadMessageBundle } from 'vscode-nls'; -const localize = loadMessageBundle(); interface IDocumentMergeConflictNavigationResults { canNavigate: boolean; @@ -92,7 +90,7 @@ export default class CommandHandler implements vscode.Disposable { // Still failed to find conflict, warn the user and exit if (!conflict) { - vscode.window.showWarningMessage(localize('cursorNotInConflict', 'Editor cursor is not within a merge conflict')); + vscode.window.showWarningMessage(vscode.l10n.t("Editor cursor is not within a merge conflict")); return; } } @@ -101,7 +99,7 @@ export default class CommandHandler implements vscode.Disposable { // Still failed to find conflict, warn the user and exit if (!conflicts) { - vscode.window.showWarningMessage(localize('cursorNotInConflict', 'Editor cursor is not within a merge conflict')); + vscode.window.showWarningMessage(vscode.l10n.t("Editor cursor is not within a merge conflict")); return; } @@ -134,7 +132,7 @@ export default class CommandHandler implements vscode.Disposable { const docPath = editor.document.uri.path; const fileName = docPath.substring(docPath.lastIndexOf('/') + 1); // avoid NodeJS path to keep browser webpack small - const title = localize('compareChangesTitle', '{0}: Current Changes ↔ Incoming Changes', fileName); + const title = vscode.l10n.t("{0}: Current Changes ↔ Incoming Changes", fileName); const mergeConflictConfig = vscode.workspace.getConfiguration('merge-conflict'); const openToTheSide = mergeConflictConfig.get('diffViewPosition'); const opts: vscode.TextDocumentShowOptions = { @@ -161,7 +159,7 @@ export default class CommandHandler implements vscode.Disposable { const conflict = await this.findConflictContainingSelection(editor); if (!conflict) { - vscode.window.showWarningMessage(localize('cursorNotInConflict', 'Editor cursor is not within a merge conflict')); + vscode.window.showWarningMessage(vscode.l10n.t("Editor cursor is not within a merge conflict")); return; } @@ -184,11 +182,11 @@ export default class CommandHandler implements vscode.Disposable { typeToAccept = interfaces.CommitType.Incoming; } else if (editor.selection.active.isBefore(conflict.splitter.start)) { - vscode.window.showWarningMessage(localize('cursorOnCommonAncestorsRange', 'Editor cursor is within the common ancestors block, please move it to either the "current" or "incoming" block')); + vscode.window.showWarningMessage(vscode.l10n.t('Editor cursor is within the common ancestors block, please move it to either the "current" or "incoming" block')); return; } else { - vscode.window.showWarningMessage(localize('cursorOnSplitterRange', 'Editor cursor is within the merge conflict splitter, please move it to either the "current" or "incoming" block')); + vscode.window.showWarningMessage(vscode.l10n.t('Editor cursor is within the merge conflict splitter, please move it to either the "current" or "incoming" block')); return; } @@ -210,11 +208,11 @@ export default class CommandHandler implements vscode.Disposable { if (mergeConflictConfig.get('autoNavigateNextConflict.enabled')) { return; } - vscode.window.showWarningMessage(localize('noConflicts', 'No merge conflicts found in this file')); + vscode.window.showWarningMessage(vscode.l10n.t("No merge conflicts found in this file")); return; } else if (!navigationResult.canNavigate) { - vscode.window.showWarningMessage(localize('noOtherConflictsInThisFile', 'No other merge conflicts within this file')); + vscode.window.showWarningMessage(vscode.l10n.t("No other merge conflicts within this file")); return; } else if (!navigationResult.conflict) { @@ -241,7 +239,7 @@ export default class CommandHandler implements vscode.Disposable { } if (!conflict) { - vscode.window.showWarningMessage(localize('cursorNotInConflict', 'Editor cursor is not within a merge conflict')); + vscode.window.showWarningMessage(vscode.l10n.t("Editor cursor is not within a merge conflict")); return; } @@ -261,7 +259,7 @@ export default class CommandHandler implements vscode.Disposable { const conflicts = await this.tracker.getConflicts(editor.document); if (!conflicts || conflicts.length === 0) { - vscode.window.showWarningMessage(localize('noConflicts', 'No merge conflicts found in this file')); + vscode.window.showWarningMessage(vscode.l10n.t("No merge conflicts found in this file")); return; } diff --git a/extensions/merge-conflict/src/mergeDecorator.ts b/extensions/merge-conflict/src/mergeDecorator.ts index 769ac0b8214..6c70fa79fae 100644 --- a/extensions/merge-conflict/src/mergeDecorator.ts +++ b/extensions/merge-conflict/src/mergeDecorator.ts @@ -4,8 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; import * as interfaces from './interfaces'; -import { loadMessageBundle } from 'vscode-nls'; -const localize = loadMessageBundle(); + export default class MergeDecorator implements vscode.Disposable { @@ -88,7 +87,7 @@ export default class MergeDecorator implements vscode.Disposable { outlineWidth: '1pt', outlineColor: new vscode.ThemeColor('merge.border'), after: { - contentText: ' ' + localize('currentChange', '(Current Change)'), + contentText: ' ' + vscode.l10n.t("(Current Change)"), color: new vscode.ThemeColor('descriptionForeground') } }); @@ -118,7 +117,7 @@ export default class MergeDecorator implements vscode.Disposable { outlineColor: new vscode.ThemeColor('merge.border'), isWholeLine: this.decorationUsesWholeLine, after: { - contentText: ' ' + localize('incomingChange', '(Incoming Change)'), + contentText: ' ' + vscode.l10n.t("(Incoming Change)"), color: new vscode.ThemeColor('descriptionForeground') } }); diff --git a/extensions/merge-conflict/yarn.lock b/extensions/merge-conflict/yarn.lock index 8b8c7a6c15b..e724e7fffa3 100644 --- a/extensions/merge-conflict/yarn.lock +++ b/extensions/merge-conflict/yarn.lock @@ -6,8 +6,3 @@ version "16.11.6" resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.6.tgz#6bef7a2a0ad684cf6e90fcfe31cecabd9ce0a3ae" integrity sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w== - -vscode-nls@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-5.2.0.tgz#3cb6893dd9bd695244d8a024bdf746eea665cc3f" - integrity sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng== From ed71512b9b3be3e67143f9236f780850312bc665 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Fri, 4 Nov 2022 11:39:25 -0700 Subject: [PATCH 122/185] Skip debug tree error in telemetry (#165535) Fix #164053 --- src/vs/workbench/contrib/debug/browser/repl.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/debug/browser/repl.ts b/src/vs/workbench/contrib/debug/browser/repl.ts index 7693744bcb2..9b546ce7cec 100644 --- a/src/vs/workbench/contrib/debug/browser/repl.ts +++ b/src/vs/workbench/contrib/debug/browser/repl.ts @@ -49,6 +49,7 @@ import { ServiceCollection } from 'vs/platform/instantiation/common/serviceColle import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { WorkbenchAsyncDataTree } from 'vs/platform/list/browser/listService'; +import { ILogService } from 'vs/platform/log/common/log'; import { IOpenerService } from 'vs/platform/opener/common/opener'; import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; @@ -129,6 +130,7 @@ export class Repl extends FilterViewPane implements IHistoryNavigationWidget { @ITelemetryService telemetryService: ITelemetryService, @IMenuService menuService: IMenuService, @ILanguageFeaturesService private readonly languageFeaturesService: ILanguageFeaturesService, + @ILogService private readonly logService: ILogService, ) { const filterText = storageService.get(FILTER_VALUE_STORAGE_KEY, StorageScope.WORKSPACE, ''); super({ @@ -401,7 +403,13 @@ export class Repl extends FilterViewPane implements IHistoryNavigationWidget { }); if (this.tree && treeInput !== session) { - await this.tree.setInput(session); + try { + await this.tree.setInput(session); + } catch (err) { + // Ignore error because this may happen multiple times while refreshing, + // then changing the root may fail. Log to help with debugging if needed. + this.logService.error(err); + } revealLastElement(this.tree); } } From 09f6753adc38b586fff740e23351540608cc582c Mon Sep 17 00:00:00 2001 From: Raymond Zhao <7199958+rzhao271@users.noreply.github.com> Date: Fri, 4 Nov 2022 11:41:56 -0700 Subject: [PATCH 123/185] Move some keybinding editor colours to CSS (#165537) Ref #165169 --- .../preferences/browser/keybindingsEditor.ts | 40 ++----------------- .../browser/media/keybindingsEditor.css | 25 ++++++++++++ 2 files changed, 28 insertions(+), 37 deletions(-) diff --git a/src/vs/workbench/contrib/preferences/browser/keybindingsEditor.ts b/src/vs/workbench/contrib/preferences/browser/keybindingsEditor.ts index 7b06f4da2f8..9305e26ac56 100644 --- a/src/vs/workbench/contrib/preferences/browser/keybindingsEditor.ts +++ b/src/vs/workbench/contrib/preferences/browser/keybindingsEditor.ts @@ -29,7 +29,7 @@ import { IListContextMenuEvent } from 'vs/base/browser/ui/list/list'; import { IThemeService, registerThemingParticipant, IColorTheme, ICssStyleCollector, ThemeIcon } from 'vs/platform/theme/common/themeService'; import { IContextKeyService, IContextKey, ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { KeyCode } from 'vs/base/common/keyCodes'; -import { listHighlightForeground, badgeBackground, contrastBorder, badgeForeground, listActiveSelectionForeground, listInactiveSelectionForeground, listHoverForeground, listFocusForeground, editorBackground, foreground, listActiveSelectionBackground, listInactiveSelectionBackground, listFocusBackground, listHoverBackground, registerColor, tableOddRowsBackgroundColor } from 'vs/platform/theme/common/colorRegistry'; +import { badgeBackground, contrastBorder, badgeForeground, listActiveSelectionForeground, listInactiveSelectionForeground, listHoverForeground, listFocusForeground, editorBackground, foreground, listActiveSelectionBackground, listInactiveSelectionBackground, listFocusBackground, listHoverBackground, registerColor, tableOddRowsBackgroundColor } from 'vs/platform/theme/common/colorRegistry'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { EditorExtensionsRegistry } from 'vs/editor/browser/editorExtensions'; import { WorkbenchTable } from 'vs/platform/list/browser/listService'; @@ -1140,26 +1140,12 @@ class AccessibilityProvider implements IListAccessibilityProvider { - - const tableHeader = theme.getColor(keybindingTableHeader); - if (tableHeader) { - collector.addRule(`.keybindings-editor > .keybindings-body > .keybindings-table-container .monaco-table .monaco-table-th { background-color: ${tableHeader}; }`); - } - - const tableRows = theme.getColor(keybindingTableRows); - if (tableRows) { - collector.addRule(`.keybindings-editor > .keybindings-body > .keybindings-table-container .monaco-table .monaco-list-row[data-parity=odd]:not(.focused):not(.selected):not(:hover) .monaco-table-tr { background-color: ${tableRows}; }`); - collector.addRule(`.keybindings-editor > .keybindings-body > .keybindings-table-container .monaco-table .monaco-list:not(:focus) .monaco-list-row[data-parity=odd].focused:not(.selected):not(:hover) .monaco-table-tr { background-color: ${tableRows}; }`); - collector.addRule(`.keybindings-editor > .keybindings-body > .keybindings-table-container .monaco-table .monaco-list:not(.focused) .monaco-list-row[data-parity=odd].focused:not(.selected):not(:hover) .monaco-table-tr { background-color: ${tableRows}; }`); - } - const foregroundColor = theme.getColor(foreground); if (foregroundColor) { const whenForegroundColor = foregroundColor.transparent(.8).makeOpaque(WORKBENCH_BACKGROUND(theme)); @@ -1193,24 +1179,4 @@ registerThemingParticipant((theme: IColorTheme, collector: ICssStyleCollector) = const whenForegroundColor = listHoverForegroundColor.transparent(.8).makeOpaque(listHoverBackgroundColor); collector.addRule(`.keybindings-editor > .keybindings-body > .keybindings-table-container .monaco-table.focused .monaco-list-row:hover:not(.focused):not(.selected) .monaco-table-tr .monaco-table-td .code { color: ${whenForegroundColor}; }`); } - - const listHighlightForegroundColor = theme.getColor(listHighlightForeground); - if (listHighlightForegroundColor) { - collector.addRule(`.keybindings-editor > .keybindings-body > .keybindings-table-container .monaco-table .monaco-table-tr .monaco-table-td .highlight { color: ${listHighlightForegroundColor}; }`); - } - - if (listActiveSelectionForegroundColor) { - collector.addRule(`.keybindings-editor > .keybindings-body > .keybindings-table-container .monaco-table.focused .monaco-list-row.selected.focused .monaco-table-tr .monaco-table-td .monaco-keybinding-key { color: ${listActiveSelectionForegroundColor}; }`); - collector.addRule(`.keybindings-editor > .keybindings-body > .keybindings-table-container .monaco-table.focused .monaco-list-row.selected .monaco-table-tr .monaco-table-td .monaco-keybinding-key { color: ${listActiveSelectionForegroundColor}; }`); - } - const listInactiveFocusAndSelectionForegroundColor = theme.getColor(listInactiveSelectionForeground); - if (listInactiveFocusAndSelectionForegroundColor) { - collector.addRule(`.keybindings-editor > .keybindings-body > .keybindings-table-container .monaco-table .monaco-list-row.selected .monaco-table-tr .monaco-table-td .monaco-keybinding-key { color: ${listInactiveFocusAndSelectionForegroundColor}; }`); - } - if (listHoverForegroundColor) { - collector.addRule(`.keybindings-editor > .keybindings-body > .keybindings-table-container .monaco-table .monaco-list-row:hover:not(.selected):not(.focused) .monaco-table-tr .monaco-table-td .monaco-keybinding-key { color: ${listHoverForegroundColor}; }`); - } - if (listFocusForegroundColor) { - collector.addRule(`.keybindings-editor > .keybindings-body > .keybindings-table-container .monaco-table .monaco-list-row.focused .monaco-table-tr .monaco-table-td .monaco-keybinding-key { color: ${listFocusForegroundColor}; }`); - } }); diff --git a/src/vs/workbench/contrib/preferences/browser/media/keybindingsEditor.css b/src/vs/workbench/contrib/preferences/browser/media/keybindingsEditor.css index 6015cbd0607..407b7ddbd98 100644 --- a/src/vs/workbench/contrib/preferences/browser/media/keybindingsEditor.css +++ b/src/vs/workbench/contrib/preferences/browser/media/keybindingsEditor.css @@ -192,6 +192,7 @@ .keybindings-editor > .keybindings-body > .keybindings-table-container .monaco-table-tr .monaco-table-td .highlight { font-weight: bold; + color: var(--vscode-list-highlightForeground); } .keybindings-editor > .keybindings-body > .keybindings-table-container .monaco-table.focused .monaco-list-row.selected .monaco-table-td .highlight, @@ -199,6 +200,30 @@ color: inherit; } +.keybindings-editor > .keybindings-body > .keybindings-table-container .monaco-table .monaco-list-row.selected .monaco-table-tr .monaco-table-td .monaco-keybinding-key, +.keybindings-editor > .keybindings-body > .keybindings-table-container .monaco-table .monaco-list-row.selected.focused .monaco-table-tr .monaco-table-td .monaco-keybinding-key { + color: var(--vscode-list-inactiveSelectionForeground); +} +.keybindings-editor > .keybindings-body > .keybindings-table-container .monaco-table .monaco-list-row.focused .monaco-table-tr .monaco-table-td .monaco-keybinding-key { + color: var(--vscode-list-focusForeground); +} +.keybindings-editor > .keybindings-body > .keybindings-table-container .monaco-table.focused .monaco-list-row.selected .monaco-table-tr .monaco-table-td .monaco-keybinding-key { + color: var(--vscode-list-activeSelectionForeground); +} +.keybindings-editor > .keybindings-body > .keybindings-table-container .monaco-table .monaco-list-row:hover:not(.selected):not(.focused) .monaco-table-tr .monaco-table-td .monaco-keybinding-key { + color: var(--vscode-list-hoverForeground); +} + +.keybindings-editor > .keybindings-body > .keybindings-table-container .monaco-table .monaco-list-row[data-parity=odd]:not(.focused):not(.selected):not(:hover) .monaco-table-tr, +.keybindings-editor > .keybindings-body > .keybindings-table-container .monaco-table .monaco-list:not(:focus) .monaco-list-row[data-parity=odd].focused:not(.selected):not(:hover) .monaco-table-tr, +.keybindings-editor > .keybindings-body > .keybindings-table-container .monaco-table .monaco-list:not(.focused) .monaco-list-row[data-parity=odd].focused:not(.selected):not(:hover) .monaco-table-tr { + background-color: var(--vscode-keybindingTable-rowsBackground); +} + +.keybindings-editor > .keybindings-body > .keybindings-table-container .monaco-table-th { + background-color: var(--vscode-keybindingTable-headerBackground); +} + .keybindings-editor .monaco-table-th, .keybindings-editor .monaco-table-td { padding-left: 10px; From 8a37410ce245986886108b036b6a8ed47cccf679 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Fri, 4 Nov 2022 12:04:47 -0700 Subject: [PATCH 124/185] Adopt l10n for extension-editing (#165523) For #164438 --- .../code-no-unexternalized-strings.ts | 8 ++++++++ extensions/extension-editing/package.json | 3 +-- .../extension-editing/src/extensionLinter.ts | 20 +++++++++---------- .../src/packageDocumentHelper.ts | 6 ++---- extensions/extension-editing/yarn.lock | 5 ----- 5 files changed, 20 insertions(+), 22 deletions(-) diff --git a/.eslintplugin/code-no-unexternalized-strings.ts b/.eslintplugin/code-no-unexternalized-strings.ts index 0dc36ff800d..a4e6f83024a 100644 --- a/.eslintplugin/code-no-unexternalized-strings.ts +++ b/.eslintplugin/code-no-unexternalized-strings.ts @@ -138,8 +138,16 @@ export = new class NoUnexternalizedStrings implements eslint.Rule.RuleModule { return { ['Literal']: (node: any) => collectDoubleQuotedStrings(node), ['ExpressionStatement[directive] Literal:exit']: (node: any) => doubleQuotedStringLiterals.delete(node), + + // localize(...) ['CallExpression[callee.type="MemberExpression"][callee.object.name="nls"][callee.property.name="localize"]:exit']: (node: any) => visitLocalizeCall(node), + + // vscode.l10n.t(...) ['CallExpression[callee.type="MemberExpression"][callee.object.property.name="l10n"][callee.property.name="t"]:exit']: (node: any) => visitL10NCall(node), + + // l10n.t(...) + ['CallExpression[callee.object.name="l10n"][callee.property.name="t"]:exit']: (node: any) => visitL10NCall(node), + ['CallExpression[callee.name="localize"][arguments.length>=2]:exit']: (node: any) => visitLocalizeCall(node), ['Program:exit']: reportBadStringsAndBadKeys, }; diff --git a/extensions/extension-editing/package.json b/extensions/extension-editing/package.json index fb50d9163b4..f7ed1ccc164 100644 --- a/extensions/extension-editing/package.json +++ b/extensions/extension-editing/package.json @@ -28,8 +28,7 @@ "dependencies": { "jsonc-parser": "^2.2.1", "markdown-it": "^12.3.2", - "parse5": "^3.0.2", - "vscode-nls": "^5.2.0" + "parse5": "^3.0.2" }, "contributes": { "jsonValidation": [ diff --git a/extensions/extension-editing/src/extensionLinter.ts b/extensions/extension-editing/src/extensionLinter.ts index e1bda75fc04..b95aa7b9e06 100644 --- a/extensions/extension-editing/src/extensionLinter.ts +++ b/extensions/extension-editing/src/extensionLinter.ts @@ -6,13 +6,11 @@ import * as path from 'path'; import * as fs from 'fs'; import { URL } from 'url'; -import * as nls from 'vscode-nls'; -const localize = nls.loadMessageBundle(); import { parseTree, findNodeAtLocation, Node as JsonNode, getNodeValue } from 'jsonc-parser'; import * as MarkdownItType from 'markdown-it'; -import { languages, workspace, Disposable, TextDocument, Uri, Diagnostic, Range, DiagnosticSeverity, Position, env } from 'vscode'; +import { languages, workspace, Disposable, TextDocument, Uri, Diagnostic, Range, DiagnosticSeverity, Position, env, l10n } from 'vscode'; const product = JSON.parse(fs.readFileSync(path.join(env.appRoot, 'product.json'), { encoding: 'utf-8' })); const allowedBadgeProviders: string[] = (product.extensionAllowedBadgeProviders || []).map((s: string) => s.toLowerCase()); @@ -23,14 +21,14 @@ function isTrustedSVGSource(uri: Uri): boolean { return allowedBadgeProviders.includes(uri.authority.toLowerCase()) || allowedBadgeProvidersRegex.some(r => r.test(uri.toString())); } -const httpsRequired = localize('httpsRequired', "Images must use the HTTPS protocol."); -const svgsNotValid = localize('svgsNotValid', "SVGs are not a valid image source."); -const embeddedSvgsNotValid = localize('embeddedSvgsNotValid', "Embedded SVGs are not a valid image source."); -const dataUrlsNotValid = localize('dataUrlsNotValid', "Data URLs are not a valid image source."); -const relativeUrlRequiresHttpsRepository = localize('relativeUrlRequiresHttpsRepository', "Relative image URLs require a repository with HTTPS protocol to be specified in the package.json."); -const relativeIconUrlRequiresHttpsRepository = localize('relativeIconUrlRequiresHttpsRepository', "An icon requires a repository with HTTPS protocol to be specified in this package.json."); -const relativeBadgeUrlRequiresHttpsRepository = localize('relativeBadgeUrlRequiresHttpsRepository', "Relative badge URLs require a repository with HTTPS protocol to be specified in this package.json."); -const apiProposalNotListed = localize('apiProposalNotListed', "This proposal cannot be used because for this extension the product defines a fixed set of API proposals. You can test your extension but before publishing you MUST reach out to the VS Code team."); +const httpsRequired = l10n.t("Images must use the HTTPS protocol."); +const svgsNotValid = l10n.t("SVGs are not a valid image source."); +const embeddedSvgsNotValid = l10n.t("Embedded SVGs are not a valid image source."); +const dataUrlsNotValid = l10n.t("Data URLs are not a valid image source."); +const relativeUrlRequiresHttpsRepository = l10n.t("Relative image URLs require a repository with HTTPS protocol to be specified in the package.json."); +const relativeIconUrlRequiresHttpsRepository = l10n.t("An icon requires a repository with HTTPS protocol to be specified in this package.json."); +const relativeBadgeUrlRequiresHttpsRepository = l10n.t("Relative badge URLs require a repository with HTTPS protocol to be specified in this package.json."); +const apiProposalNotListed = l10n.t("This proposal cannot be used because for this extension the product defines a fixed set of API proposals. You can test your extension but before publishing you MUST reach out to the VS Code team."); enum Context { ICON, diff --git a/extensions/extension-editing/src/packageDocumentHelper.ts b/extensions/extension-editing/src/packageDocumentHelper.ts index 291075d7447..67163900b5b 100644 --- a/extensions/extension-editing/src/packageDocumentHelper.ts +++ b/extensions/extension-editing/src/packageDocumentHelper.ts @@ -5,9 +5,7 @@ import * as vscode from 'vscode'; import { getLocation, Location } from 'jsonc-parser'; -import * as nls from 'vscode-nls'; -const localize = nls.loadMessageBundle(); export class PackageDocument { @@ -40,8 +38,8 @@ export class PackageDocument { } return Promise.resolve([this.newSnippetCompletionItem({ - label: localize('languageSpecificEditorSettings', "Language specific editor settings"), - documentation: localize('languageSpecificEditorSettingsDescription', "Override editor settings for language"), + label: vscode.l10n.t("Language specific editor settings"), + documentation: vscode.l10n.t("Override editor settings for language"), snippet, range })]); diff --git a/extensions/extension-editing/yarn.lock b/extensions/extension-editing/yarn.lock index 2d5b4e2f835..1902937e894 100644 --- a/extensions/extension-editing/yarn.lock +++ b/extensions/extension-editing/yarn.lock @@ -66,8 +66,3 @@ uc.micro@^1.0.1, uc.micro@^1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== - -vscode-nls@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-5.2.0.tgz#3cb6893dd9bd695244d8a024bdf746eea665cc3f" - integrity sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng== From 803161c056037bc86de8ab7ed1ffc4235a45e73a Mon Sep 17 00:00:00 2001 From: pafernandez-oesia <96843912+pafernandez-oesia@users.noreply.github.com> Date: Fri, 4 Nov 2022 20:15:13 +0100 Subject: [PATCH 125/185] Fix #165480 (#165486) --- .../contrib/welcomeGettingStarted/browser/gettingStarted.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.ts b/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.ts index b35a466ad0b..0fd7502ca53 100644 --- a/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.ts +++ b/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.ts @@ -900,7 +900,7 @@ export class GettingStartedPage extends EditorPane { { 'x-dispatch': 'showMoreRecents', title: localize('show more recents', "Show All Recent Folders {0}", this.getKeybindingLabel(OpenRecentAction.ID)) - }, 'More...')), + }, localize('showAll', "More..."))), renderElement: renderRecent, contextService: this.contextService }); From e8fa3e41f011f35c9e2f0743d1eb7ab2213cc14e Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Fri, 4 Nov 2022 12:21:19 -0700 Subject: [PATCH 126/185] Adopt l10n for jake (#165541) For #164438 --- extensions/jake/package.json | 4 +--- extensions/jake/src/main.ts | 8 +++----- extensions/jake/yarn.lock | 5 ----- 3 files changed, 4 insertions(+), 13 deletions(-) diff --git a/extensions/jake/package.json b/extensions/jake/package.json index 4e6a94a8b24..e34118ca7a3 100644 --- a/extensions/jake/package.json +++ b/extensions/jake/package.json @@ -16,9 +16,7 @@ "compile": "gulp compile-extension:jake", "watch": "gulp watch-extension:jake" }, - "dependencies": { - "vscode-nls": "^5.2.0" - }, + "dependencies": {}, "devDependencies": { "@types/node": "16.x" }, diff --git a/extensions/jake/src/main.ts b/extensions/jake/src/main.ts index eba135e1530..33d39e288a4 100644 --- a/extensions/jake/src/main.ts +++ b/extensions/jake/src/main.ts @@ -7,8 +7,6 @@ import * as path from 'path'; import * as fs from 'fs'; import * as cp from 'child_process'; import * as vscode from 'vscode'; -import * as nls from 'vscode-nls'; -const localize = nls.loadMessageBundle(); type AutoDetect = 'on' | 'off'; @@ -60,8 +58,8 @@ function getOutputChannel(): vscode.OutputChannel { } function showError() { - vscode.window.showWarningMessage(localize('jakeTaskDetectError', 'Problem finding jake tasks. See the output for more information.'), - localize('jakeShowOutput', 'Go to output')).then(() => { + vscode.window.showWarningMessage(vscode.l10n.t("Problem finding jake tasks. See the output for more information."), + vscode.l10n.t("Go to output")).then(() => { getOutputChannel().show(true); }); } @@ -189,7 +187,7 @@ class FolderDetector { if (err.stdout) { channel.appendLine(err.stdout); } - channel.appendLine(localize('execFailed', 'Auto detecting Jake for folder {0} failed with error: {1}', this.workspaceFolder.name, err.error ? err.error.toString() : 'unknown')); + channel.appendLine(vscode.l10n.t("Auto detecting Jake for folder {0} failed with error: {1}', this.workspaceFolder.name, err.error ? err.error.toString() : 'unknown")); showError(); return emptyTasks; } diff --git a/extensions/jake/yarn.lock b/extensions/jake/yarn.lock index 8b8c7a6c15b..e724e7fffa3 100644 --- a/extensions/jake/yarn.lock +++ b/extensions/jake/yarn.lock @@ -6,8 +6,3 @@ version "16.11.6" resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.6.tgz#6bef7a2a0ad684cf6e90fcfe31cecabd9ce0a3ae" integrity sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w== - -vscode-nls@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-5.2.0.tgz#3cb6893dd9bd695244d8a024bdf746eea665cc3f" - integrity sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng== From 65a6e4f02df6a11de81b905059027533e60215c7 Mon Sep 17 00:00:00 2001 From: Tyler James Leonhardt Date: Fri, 4 Nov 2022 12:26:23 -0700 Subject: [PATCH 127/185] More logs around SecretStorage (#165542) --- .../encryption/node/encryptionMainService.ts | 25 +++++++++++++++---- .../api/browser/mainThreadSecretState.ts | 13 +++++++--- 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/src/vs/platform/encryption/node/encryptionMainService.ts b/src/vs/platform/encryption/node/encryptionMainService.ts index c989b431571..5396bd31b96 100644 --- a/src/vs/platform/encryption/node/encryptionMainService.ts +++ b/src/vs/platform/encryption/node/encryptionMainService.ts @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { ICommonEncryptionService } from 'vs/platform/encryption/common/encryptionService'; +import { ILogService } from 'vs/platform/log/common/log'; export interface Encryption { encrypt(salt: string, value: string): Promise; @@ -12,28 +13,42 @@ export interface Encryption { export class EncryptionMainService implements ICommonEncryptionService { declare readonly _serviceBrand: undefined; constructor( - private machineId: string) { - - } + private machineId: string, + @ILogService private readonly logService: ILogService + ) { } private encryption(): Promise { return new Promise((resolve, reject) => require(['vscode-encrypt'], resolve, reject)); } async encrypt(value: string): Promise { + let encryption: Encryption; + try { + encryption = await this.encryption(); + } catch (e) { + return value; + } + try { - const encryption = await this.encryption(); return encryption.encrypt(this.machineId, value); } catch (e) { + this.logService.error(e); return value; } } async decrypt(value: string): Promise { + let encryption: Encryption; + try { + encryption = await this.encryption(); + } catch (e) { + return value; + } + try { - const encryption = await this.encryption(); return encryption.decrypt(this.machineId, value); } catch (e) { + this.logService.error(e); return value; } } diff --git a/src/vs/workbench/api/browser/mainThreadSecretState.ts b/src/vs/workbench/api/browser/mainThreadSecretState.ts index 7fc600da2fd..fa060494732 100644 --- a/src/vs/workbench/api/browser/mainThreadSecretState.ts +++ b/src/vs/workbench/api/browser/mainThreadSecretState.ts @@ -36,19 +36,21 @@ export class MainThreadSecretState extends Disposable implements MainThreadSecre } async $getPassword(extensionId: string, key: string): Promise { - this.logService.trace(`Getting password for ${extensionId} extension:`, key); + this.logService.trace(`MainThreadSecretState#getPassword: Getting password for ${extensionId} extension: `, key); const fullKey = await this.getFullKey(extensionId); const password = await this.credentialsService.getPassword(fullKey, key); if (!password) { - this.logService.trace('No password found for:', key); + this.logService.trace('MainThreadSecretState#getPassword: No password found for: ', key); return undefined; } let decrypted: string | null; try { + this.logService.trace('MainThreadSecretState#getPassword: Decrypting password for: ', key); decrypted = await this.encryptionService.decrypt(password); } catch (e) { this.logService.error(e); + this.logService.trace('MainThreadSecretState#getPassword: Trying migration for: ', key); // If we are on a platform that newly started encrypting secrets before storing them, // then passwords previously stored were stored un-encrypted (NOTE: but still being stored in a secure keyring). @@ -65,7 +67,7 @@ export class MainThreadSecretState extends Disposable implements MainThreadSecre try { const value = JSON.parse(decrypted); if (value.extensionId === extensionId) { - this.logService.trace('Password found for:', key); + this.logService.trace('MainThreadSecretState#getPassword: Password found for: ', key); return value.content; } } catch (parseError) { @@ -82,17 +84,20 @@ export class MainThreadSecretState extends Disposable implements MainThreadSecre } } - this.logService.trace('No password found for:', key); + this.logService.trace('MainThreadSecretState#getPassword: No password found for: ', key); return undefined; } async $setPassword(extensionId: string, key: string, value: string): Promise { + this.logService.trace(`MainThreadSecretState#setPassword: Setting password for ${extensionId} extension: `, key); const fullKey = await this.getFullKey(extensionId); const toEncrypt = JSON.stringify({ extensionId, content: value }); + this.logService.trace('MainThreadSecretState#setPassword: Encrypting password for: ', key); const encrypted = await this.encryptionService.encrypt(toEncrypt); + this.logService.trace('MainThreadSecretState#setPassword: Storing password for: ', key); return await this.credentialsService.setPassword(fullKey, key, encrypted); } From 6ef8bb8a6acda9460f0dcab3c10c5763649f1c70 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Fri, 4 Nov 2022 12:34:59 -0700 Subject: [PATCH 128/185] Adopt l10n for gulp (#165543) For #164438 --- extensions/gulp/package.json | 4 +--- extensions/gulp/src/main.ts | 8 +++----- extensions/gulp/yarn.lock | 5 ----- 3 files changed, 4 insertions(+), 13 deletions(-) diff --git a/extensions/gulp/package.json b/extensions/gulp/package.json index 41c23eb1145..10e41222219 100644 --- a/extensions/gulp/package.json +++ b/extensions/gulp/package.json @@ -16,9 +16,7 @@ "compile": "gulp compile-extension:gulp", "watch": "gulp watch-extension:gulp" }, - "dependencies": { - "vscode-nls": "^5.2.0" - }, + "dependencies": {}, "devDependencies": { "@types/node": "16.x" }, diff --git a/extensions/gulp/src/main.ts b/extensions/gulp/src/main.ts index ae7ea83c4a9..284175741a5 100644 --- a/extensions/gulp/src/main.ts +++ b/extensions/gulp/src/main.ts @@ -7,9 +7,7 @@ import * as path from 'path'; import * as fs from 'fs'; import * as cp from 'child_process'; import * as vscode from 'vscode'; -import * as nls from 'vscode-nls'; -const localize = nls.loadMessageBundle(); type AutoDetect = 'on' | 'off'; @@ -80,8 +78,8 @@ function getOutputChannel(): vscode.OutputChannel { } function showError() { - vscode.window.showWarningMessage(localize('gulpTaskDetectError', 'Problem finding gulp tasks. See the output for more information.'), - localize('gulpShowOutput', 'Go to output')).then((choice) => { + vscode.window.showWarningMessage(vscode.l10n.t("Problem finding gulp tasks. See the output for more information."), + vscode.l10n.t("Go to output")).then((choice) => { if (choice !== undefined) { _channel.show(true); } @@ -256,7 +254,7 @@ class FolderDetector { if (err.stdout) { channel.appendLine(err.stdout); } - channel.appendLine(localize('execFailed', 'Auto detecting gulp for folder {0} failed with error: {1}', this.workspaceFolder.name, err.error ? err.error.toString() : 'unknown')); + channel.appendLine(vscode.l10n.t("Auto detecting gulp for folder {0} failed with error: {1}', this.workspaceFolder.name, err.error ? err.error.toString() : 'unknown")); showError(); return emptyTasks; } diff --git a/extensions/gulp/yarn.lock b/extensions/gulp/yarn.lock index 8b8c7a6c15b..e724e7fffa3 100644 --- a/extensions/gulp/yarn.lock +++ b/extensions/gulp/yarn.lock @@ -6,8 +6,3 @@ version "16.11.6" resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.6.tgz#6bef7a2a0ad684cf6e90fcfe31cecabd9ce0a3ae" integrity sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w== - -vscode-nls@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-5.2.0.tgz#3cb6893dd9bd695244d8a024bdf746eea665cc3f" - integrity sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng== From c91649f9f78e4adf8e06d25fb73ed3d96773d87e Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Fri, 4 Nov 2022 20:39:40 +0100 Subject: [PATCH 129/185] Comment widget doesn't work with inline diffs on deleted lines (#165547) Fixes #164729 --- .../browser/commentsEditorContribution.ts | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/comments/browser/commentsEditorContribution.ts b/src/vs/workbench/contrib/comments/browser/commentsEditorContribution.ts index af59bb1d79c..da5c81f2b62 100644 --- a/src/vs/workbench/contrib/comments/browser/commentsEditorContribution.ts +++ b/src/vs/workbench/contrib/comments/browser/commentsEditorContribution.ts @@ -51,6 +51,9 @@ import { commentThreadRangeActiveBackground, commentThreadRangeActiveBorder, com import { ICursorSelectionChangedEvent } from 'vs/editor/common/cursorEvents'; import { CommentsPanel } from 'vs/workbench/contrib/comments/browser/commentsView'; import { withNullAsUndefined, withUndefinedAsNull } from 'vs/base/common/types'; +import { DiffEditorInput } from 'vs/workbench/common/editor/diffEditorInput'; +import { EditorInput } from 'vs/workbench/common/editor/editorInput'; +import { URI } from 'vs/base/common/uri'; export const ID = 'editor.contrib.review'; @@ -345,7 +348,8 @@ export class CommentController implements IEditorContribution { @IQuickInputService private readonly quickInputService: IQuickInputService, @IViewsService private readonly viewsService: IViewsService, @IConfigurationService private readonly configurationService: IConfigurationService, - @IContextKeyService readonly contextKeyService: IContextKeyService + @IContextKeyService readonly contextKeyService: IContextKeyService, + @IEditorService private readonly editorService: IEditorService ) { this._commentInfos = []; this._commentWidgets = []; @@ -458,6 +462,13 @@ export class CommentController implements IEditorContribution { this._activeCursorHasCommentingRange.set(hasCommentingRange); } + private isEditorInlineOriginal(editorURI: URI | undefined, activeEditor: EditorInput | undefined): activeEditor is DiffEditorInput { + if (editorURI && activeEditor instanceof DiffEditorInput && !this.configurationService.getValue('diffEditor.renderSideBySide')) { + return activeEditor.original.resource?.toString() === editorURI.toString(); + } + return false; + } + private beginCompute(): Promise { this._computePromise = createCancelablePromise(token => { const editorURI = this.editor && this.editor.hasModel() && this.editor.getModel().uri; @@ -723,6 +734,10 @@ export class CommentController implements IEditorContribution { if (!this.editor) { return; } + const activeEditor = this.editorService.activeEditor; + if (this.isEditorInlineOriginal(this.editor.getModel()?.uri, activeEditor)) { + return; + } const zoneWidget = this.instantiationService.createInstance(ReviewZoneWidget, this.editor, owner, thread, pendingComment); zoneWidget.display(thread.range.endLineNumber); this._commentWidgets.push(zoneWidget); From 4001e9d6d85f4be2286dc5f49f653bd469be4ddc Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Fri, 4 Nov 2022 12:56:28 -0700 Subject: [PATCH 130/185] Try to sort console history entries in recency order (#165549) Fix #148072 --- src/vs/workbench/contrib/debug/browser/repl.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/debug/browser/repl.ts b/src/vs/workbench/contrib/debug/browser/repl.ts index 9b546ce7cec..bde7d011b9c 100644 --- a/src/vs/workbench/contrib/debug/browser/repl.ts +++ b/src/vs/workbench/contrib/debug/browser/repl.ts @@ -270,12 +270,13 @@ export class Repl extends FilterViewPane implements IHistoryNavigationWidget { if (this.configurationService.getValue('debug').console.historySuggestions) { const history = this.history.getHistory(); - history.forEach(h => suggestions.push({ + const idxLength = String(history.length).length; + history.forEach((h, i) => suggestions.push({ label: h, insertText: h, kind: CompletionItemKind.Text, range: computeRange(h.length), - sortText: 'ZZZ' + sortText: 'ZZZ' + String(history.length - i).padStart(idxLength, '0') })); } From ac26690ed80cabe8c4face379d7df1493f9fc069 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Fri, 4 Nov 2022 13:50:21 -0700 Subject: [PATCH 131/185] Adopt l10n for grunt and php-language-features (#165552) * Adopt l10n for grunt For #164438 * Adopt l10n for php-language-features For #164438 --- extensions/grunt/package.json | 4 +--- extensions/grunt/src/main.ts | 8 +++----- extensions/grunt/yarn.lock | 5 ----- extensions/php-language-features/package.json | 1 - .../src/features/validationProvider.ts | 12 +++++------- extensions/php-language-features/yarn.lock | 5 ----- 6 files changed, 9 insertions(+), 26 deletions(-) diff --git a/extensions/grunt/package.json b/extensions/grunt/package.json index 0f5e605bcf9..35fc30eaba1 100644 --- a/extensions/grunt/package.json +++ b/extensions/grunt/package.json @@ -16,9 +16,7 @@ "compile": "gulp compile-extension:grunt", "watch": "gulp watch-extension:grunt" }, - "dependencies": { - "vscode-nls": "^5.2.0" - }, + "dependencies": {}, "devDependencies": { "@types/node": "16.x" }, diff --git a/extensions/grunt/src/main.ts b/extensions/grunt/src/main.ts index c213f1c69c9..886e7e27e71 100644 --- a/extensions/grunt/src/main.ts +++ b/extensions/grunt/src/main.ts @@ -7,8 +7,6 @@ import * as path from 'path'; import * as fs from 'fs'; import * as cp from 'child_process'; import * as vscode from 'vscode'; -import * as nls from 'vscode-nls'; -const localize = nls.loadMessageBundle(); type AutoDetect = 'on' | 'off'; @@ -60,8 +58,8 @@ function getOutputChannel(): vscode.OutputChannel { } function showError() { - vscode.window.showWarningMessage(localize('gruntTaskDetectError', 'Problem finding grunt tasks. See the output for more information.'), - localize('gruntShowOutput', 'Go to output')).then(() => { + vscode.window.showWarningMessage(vscode.l10n.t("Problem finding grunt tasks. See the output for more information."), + vscode.l10n.t("Go to output")).then(() => { getOutputChannel().show(true); }); } @@ -215,7 +213,7 @@ class FolderDetector { if (err.stdout) { channel.appendLine(err.stdout); } - channel.appendLine(localize('execFailed', 'Auto detecting Grunt for folder {0} failed with error: {1}', this.workspaceFolder.name, err.error ? err.error.toString() : 'unknown')); + channel.appendLine(vscode.l10n.t("Auto detecting Grunt for folder {0} failed with error: {1}', this.workspaceFolder.name, err.error ? err.error.toString() : 'unknown")); showError(); return emptyTasks; } diff --git a/extensions/grunt/yarn.lock b/extensions/grunt/yarn.lock index 8b8c7a6c15b..e724e7fffa3 100644 --- a/extensions/grunt/yarn.lock +++ b/extensions/grunt/yarn.lock @@ -6,8 +6,3 @@ version "16.11.6" resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.6.tgz#6bef7a2a0ad684cf6e90fcfe31cecabd9ce0a3ae" integrity sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w== - -vscode-nls@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-5.2.0.tgz#3cb6893dd9bd695244d8a024bdf746eea665cc3f" - integrity sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng== diff --git a/extensions/php-language-features/package.json b/extensions/php-language-features/package.json index dd7f6445d1a..8f9723197b2 100644 --- a/extensions/php-language-features/package.json +++ b/extensions/php-language-features/package.json @@ -74,7 +74,6 @@ "watch": "npx gulp watch-extension:php-language-features" }, "dependencies": { - "vscode-nls": "^5.2.0", "which": "^2.0.2" }, "devDependencies": { diff --git a/extensions/php-language-features/src/features/validationProvider.ts b/extensions/php-language-features/src/features/validationProvider.ts index b50e2e8e779..d1f27e4a37e 100644 --- a/extensions/php-language-features/src/features/validationProvider.ts +++ b/extensions/php-language-features/src/features/validationProvider.ts @@ -9,8 +9,6 @@ import * as which from 'which'; import * as path from 'path'; import * as vscode from 'vscode'; import { ThrottledDelayer } from './utils/async'; -import * as nls from 'vscode-nls'; -const localize = nls.loadMessageBundle(); const enum Setting { Run = 'php.validate.run', @@ -179,7 +177,7 @@ export default class PHPValidationProvider { return new Promise(resolve => { const executable = this.config!.executable; if (!executable) { - this.showErrorMessage(localize('noPhp', 'Cannot validate since a PHP installation could not be found. Use the setting \'php.validate.executablePath\' to configure the PHP executable.')); + this.showErrorMessage(vscode.l10n.t("Cannot validate since a PHP installation could not be found. Use the setting 'php.validate.executablePath' to configure the PHP executable.")); this.pauseValidation = true; resolve(); return; @@ -254,12 +252,12 @@ export default class PHPValidationProvider { let message: string | null = null; if (error.code === 'ENOENT') { if (this.config!.executable) { - message = localize('wrongExecutable', 'Cannot validate since {0} is not a valid php executable. Use the setting \'php.validate.executablePath\' to configure the PHP executable.', executable); + message = vscode.l10n.t("Cannot validate since {0} is not a valid php executable. Use the setting 'php.validate.executablePath' to configure the PHP executable.", executable); } else { - message = localize('noExecutable', 'Cannot validate since no PHP executable is set. Use the setting \'php.validate.executablePath\' to configure the PHP executable.'); + message = vscode.l10n.t("Cannot validate since no PHP executable is set. Use the setting 'php.validate.executablePath' to configure the PHP executable."); } } else { - message = error.message ? error.message : localize('unknownReason', 'Failed to run php using path: {0}. Reason is unknown.', executable); + message = error.message ? error.message : vscode.l10n.t("Failed to run php using path: {0}. Reason is unknown.", executable); } if (!message) { return; @@ -269,7 +267,7 @@ export default class PHPValidationProvider { } private async showErrorMessage(message: string): Promise { - const openSettings = localize('goToSetting', 'Open Settings'); + const openSettings = vscode.l10n.t("Open Settings"); if (await vscode.window.showInformationMessage(message, openSettings) === openSettings) { vscode.commands.executeCommand('workbench.action.openSettings', Setting.ExecutablePath); } diff --git a/extensions/php-language-features/yarn.lock b/extensions/php-language-features/yarn.lock index baafbeb7ca3..a418ca9f823 100644 --- a/extensions/php-language-features/yarn.lock +++ b/extensions/php-language-features/yarn.lock @@ -17,11 +17,6 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= -vscode-nls@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-5.2.0.tgz#3cb6893dd9bd695244d8a024bdf746eea665cc3f" - integrity sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng== - which@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" From 952bbb6720470272161d33cf77684a70a024fd42 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Fri, 4 Nov 2022 13:56:39 -0700 Subject: [PATCH 132/185] Adopt l10n for npm package (#165527) For #164438 --- extensions/npm/package.json | 1 - extensions/npm/src/commands.ts | 4 +--- .../npm/src/features/bowerJSONContribution.ts | 12 +++++------ .../src/features/packageJSONContribution.ts | 20 +++++++++---------- extensions/npm/src/npmScriptLens.ts | 7 +++---- extensions/npm/src/npmView.ts | 8 +++----- extensions/npm/src/scriptHover.ts | 12 +++++------ extensions/npm/src/tasks.ts | 12 +++++------ extensions/npm/yarn.lock | 5 ----- 9 files changed, 31 insertions(+), 50 deletions(-) diff --git a/extensions/npm/package.json b/extensions/npm/package.json index cae1fd7eab1..40ec7e7f4ae 100644 --- a/extensions/npm/package.json +++ b/extensions/npm/package.json @@ -22,7 +22,6 @@ "jsonc-parser": "^2.2.1", "minimatch": "^3.0.4", "request-light": "^0.5.7", - "vscode-nls": "^5.2.0", "which": "^2.0.2", "which-pm": "^2.0.0" }, diff --git a/extensions/npm/src/commands.ts b/extensions/npm/src/commands.ts index a0eb72eec79..a5b1deaef39 100644 --- a/extensions/npm/src/commands.ts +++ b/extensions/npm/src/commands.ts @@ -3,7 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as nls from 'vscode-nls'; import * as vscode from 'vscode'; import { @@ -13,7 +12,6 @@ import { IFolderTaskItem } from './tasks'; -const localize = nls.loadMessageBundle(); export function runSelectedScript(context: vscode.ExtensionContext) { const editor = vscode.window.activeTextEditor; @@ -26,7 +24,7 @@ export function runSelectedScript(context: vscode.ExtensionContext) { if (script) { runScript(context, script, document); } else { - const message = localize('noScriptFound', 'Could not find a valid npm script at the selection.'); + const message = vscode.l10n.t("Could not find a valid npm script at the selection."); vscode.window.showErrorMessage(message); } } diff --git a/extensions/npm/src/features/bowerJSONContribution.ts b/extensions/npm/src/features/bowerJSONContribution.ts index df89c700afe..c7a1f380954 100644 --- a/extensions/npm/src/features/bowerJSONContribution.ts +++ b/extensions/npm/src/features/bowerJSONContribution.ts @@ -3,13 +3,11 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { MarkdownString, CompletionItemKind, CompletionItem, DocumentSelector, SnippetString, workspace, Uri } from 'vscode'; +import { MarkdownString, CompletionItemKind, CompletionItem, DocumentSelector, SnippetString, workspace, Uri, l10n } from 'vscode'; import { IJSONContribution, ISuggestionsCollector } from './jsonContributions'; import { XHRRequest } from 'request-light'; import { Location } from 'jsonc-parser'; -import * as nls from 'vscode-nls'; -const localize = nls.loadMessageBundle(); const USER_AGENT = 'Visual Studio Code'; @@ -46,7 +44,7 @@ export class BowerJSONContribution implements IJSONContribution { 'main': '${5:pathToMain}', 'dependencies': {} }; - const proposal = new CompletionItem(localize('json.bower.default', 'Default bower.json')); + const proposal = new CompletionItem(l10n.t("Default bower.json")); proposal.kind = CompletionItemKind.Class; proposal.insertText = new SnippetString(JSON.stringify(defaultValue, null, '\t')); collector.add(proposal); @@ -93,12 +91,12 @@ export class BowerJSONContribution implements IJSONContribution { // ignore } } else { - collector.error(localize('json.bower.error.repoaccess', 'Request to the bower repository failed: {0}', success.responseText)); + collector.error(l10n.t("Request to the bower repository failed: {0}", success.responseText)); return 0; } return undefined; }, (error) => { - collector.error(localize('json.bower.error.repoaccess', 'Request to the bower repository failed: {0}', error.responseText)); + collector.error(l10n.t("Request to the bower repository failed: {0}", error.responseText)); return 0; }); } else { @@ -131,7 +129,7 @@ export class BowerJSONContribution implements IJSONContribution { } if ((location.matches(['dependencies', '*']) || location.matches(['devDependencies', '*']))) { // not implemented. Could be do done calling the bower command. Waiting for web API: https://github.com/bower/registry/issues/26 - const proposal = new CompletionItem(localize('json.bower.latest.version', 'latest')); + const proposal = new CompletionItem(l10n.t("latest")); proposal.insertText = new SnippetString('"${1:latest}"'); proposal.filterText = '""'; proposal.kind = CompletionItemKind.Value; diff --git a/extensions/npm/src/features/packageJSONContribution.ts b/extensions/npm/src/features/packageJSONContribution.ts index 093fea678bc..7368f8cbf86 100644 --- a/extensions/npm/src/features/packageJSONContribution.ts +++ b/extensions/npm/src/features/packageJSONContribution.ts @@ -3,15 +3,13 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { CompletionItemKind, CompletionItem, DocumentSelector, SnippetString, workspace, MarkdownString, Uri } from 'vscode'; +import { CompletionItemKind, CompletionItem, DocumentSelector, SnippetString, workspace, MarkdownString, Uri, l10n } from 'vscode'; import { IJSONContribution, ISuggestionsCollector } from './jsonContributions'; import { XHRRequest } from 'request-light'; import { Location } from 'jsonc-parser'; import * as cp from 'child_process'; -import * as nls from 'vscode-nls'; import { dirname } from 'path'; -const localize = nls.loadMessageBundle(); const LIMIT = 40; @@ -44,7 +42,7 @@ export class PackageJSONContribution implements IJSONContribution { 'main': '${5:pathToMain}', 'dependencies': {} }; - const proposal = new CompletionItem(localize('json.package.default', 'Default package.json')); + const proposal = new CompletionItem(l10n.t("Default package.json")); proposal.kind = CompletionItemKind.Module; proposal.insertText = new SnippetString(JSON.stringify(defaultValue, null, '\t')); result.add(proposal); @@ -113,12 +111,12 @@ export class PackageJSONContribution implements IJSONContribution { } collector.setAsIncomplete(); } else { - collector.error(localize('json.npm.error.repoaccess', 'Request to the NPM repository failed: {0}', success.responseText)); + collector.error(l10n.t("Request to the NPM repository failed: {0}", success.responseText)); return 0; } return undefined; }, (error) => { - collector.error(localize('json.npm.error.repoaccess', 'Request to the NPM repository failed: {0}', error.responseText)); + collector.error(l10n.t("Request to the NPM repository failed: {0}", error.responseText)); return 0; }); } else { @@ -172,7 +170,7 @@ export class PackageJSONContribution implements IJSONContribution { } collector.setAsIncomplete(); } else { - collector.error(localize('json.npm.error.repoaccess', 'Request to the NPM repository failed: {0}', success.responseText)); + collector.error(l10n.t("Request to the NPM repository failed: {0}", success.responseText)); } return null; }); @@ -195,21 +193,21 @@ export class PackageJSONContribution implements IJSONContribution { let proposal = new CompletionItem(name); proposal.kind = CompletionItemKind.Property; proposal.insertText = name; - proposal.documentation = localize('json.npm.latestversion', 'The currently latest version of the package'); + proposal.documentation = l10n.t("The currently latest version of the package"); result.add(proposal); name = JSON.stringify('^' + info.version); proposal = new CompletionItem(name); proposal.kind = CompletionItemKind.Property; proposal.insertText = name; - proposal.documentation = localize('json.npm.majorversion', 'Matches the most recent major version (1.x.x)'); + proposal.documentation = l10n.t("Matches the most recent major version (1.x.x)"); result.add(proposal); name = JSON.stringify('~' + info.version); proposal = new CompletionItem(name); proposal.kind = CompletionItemKind.Property; proposal.insertText = name; - proposal.documentation = localize('json.npm.minorversion', 'Matches the most recent minor version (1.2.x)'); + proposal.documentation = l10n.t("Matches the most recent minor version (1.2.x)"); result.add(proposal); } } @@ -224,7 +222,7 @@ export class PackageJSONContribution implements IJSONContribution { } if (version) { str.appendText('\n\n'); - str.appendText(localize('json.npm.version.hover', 'Latest version: {0}', version)); + str.appendText(l10n.t("Latest version: {0}", version)); } if (homepage) { str.appendText('\n\n'); diff --git a/extensions/npm/src/npmScriptLens.ts b/extensions/npm/src/npmScriptLens.ts index 2834d3e7639..2f2b9342b02 100644 --- a/extensions/npm/src/npmScriptLens.ts +++ b/extensions/npm/src/npmScriptLens.ts @@ -12,13 +12,12 @@ import { languages, TextDocument, Uri, - workspace + workspace, + l10n } from 'vscode'; -import * as nls from 'vscode-nls'; import { findPreferredPM } from './preferred-pm'; import { readScripts } from './readScripts'; -const localize = nls.loadMessageBundle(); const enum Constants { ConfigKey = 'debug.javascript.codelens.npmScripts', @@ -71,7 +70,7 @@ export class NpmScriptLensProvider implements CodeLensProvider, Disposable { return []; } - const title = '$(debug-start) ' + localize('codelens.debug', 'Debug'); + const title = '$(debug-start) ' + l10n.t("Debug"); const cwd = path.dirname(document.uri.fsPath); if (this.lensLocation === 'top') { return [ diff --git a/extensions/npm/src/npmView.ts b/extensions/npm/src/npmView.ts index 3ed572a06f9..d087e75347a 100644 --- a/extensions/npm/src/npmView.ts +++ b/extensions/npm/src/npmView.ts @@ -9,9 +9,8 @@ import { Range, Selection, Task, TaskGroup, tasks, TextDocument, TextDocumentShowOptions, ThemeIcon, TreeDataProvider, TreeItem, TreeItemLabel, TreeItemCollapsibleState, Uri, - window, workspace, WorkspaceFolder, Position, Location + window, workspace, WorkspaceFolder, Position, Location, l10n } from 'vscode'; -import * as nls from 'vscode-nls'; import { readScripts } from './readScripts'; import { createTask, getPackageManager, getTaskName, isAutoDetectionEnabled, isWorkspaceFolder, INpmTaskDefinition, @@ -20,7 +19,6 @@ import { ITaskWithLocation } from './tasks'; -const localize = nls.loadMessageBundle(); class Folder extends TreeItem { packages: PackageJSON[] = []; @@ -231,9 +229,9 @@ export class NpmScriptsTreeDataProvider implements TreeDataProvider { const taskTree = this.buildTaskTree(taskItems); this.taskTree = this.sortTaskTree(taskTree); if (this.taskTree.length === 0) { - let message = localize('noScripts', 'No scripts found.'); + let message = l10n.t("No scripts found."); if (!isAutoDetectionEnabled()) { - message = localize('autoDetectIsOff', 'The setting "npm.autoDetect" is "off".'); + message = l10n.t('The setting "npm.autoDetect" is "off".'); } this.taskTree = [new NoScripts(message)]; } diff --git a/extensions/npm/src/scriptHover.ts b/extensions/npm/src/scriptHover.ts index c96f3330d39..b3a87e05198 100644 --- a/extensions/npm/src/scriptHover.ts +++ b/extensions/npm/src/scriptHover.ts @@ -6,18 +6,16 @@ import { dirname } from 'path'; import { CancellationToken, commands, ExtensionContext, - Hover, HoverProvider, MarkdownString, Position, ProviderResult, + Hover, HoverProvider, MarkdownString, l10n, Position, ProviderResult, tasks, TextDocument, Uri, workspace } from 'vscode'; -import * as nls from 'vscode-nls'; import { INpmScriptInfo, readScripts } from './readScripts'; import { createTask, getPackageManager, startDebugging } from './tasks'; -const localize = nls.loadMessageBundle(); let cachedDocument: Uri | undefined = undefined; let cachedScripts: INpmScriptInfo | undefined = undefined; @@ -81,10 +79,10 @@ export class NpmScriptHoverProvider implements HoverProvider { script: script, }; return this.createMarkdownLink( - localize('runScript', 'Run Script'), + l10n.t("Run Script"), 'npm.runScriptFromHover', args, - localize('runScript.tooltip', 'Run the script as a task') + l10n.t("Run the script as a task") ); } @@ -94,10 +92,10 @@ export class NpmScriptHoverProvider implements HoverProvider { script: script, }; return this.createMarkdownLink( - localize('debugScript', 'Debug Script'), + l10n.t("Debug Script"), 'npm.debugScriptFromHover', args, - localize('debugScript.tooltip', 'Runs the script under the debugger'), + l10n.t("Runs the script under the debugger"), '|' ); } diff --git a/extensions/npm/src/tasks.ts b/extensions/npm/src/tasks.ts index 9eba265236a..7bd6b1a2b14 100644 --- a/extensions/npm/src/tasks.ts +++ b/extensions/npm/src/tasks.ts @@ -6,17 +6,15 @@ import { TaskDefinition, Task, TaskGroup, WorkspaceFolder, RelativePattern, ShellExecution, Uri, workspace, TaskProvider, TextDocument, tasks, TaskScope, QuickPickItem, window, Position, ExtensionContext, env, - ShellQuotedString, ShellQuoting, commands, Location, CancellationTokenSource + ShellQuotedString, ShellQuoting, commands, Location, CancellationTokenSource, l10n } from 'vscode'; import * as path from 'path'; import * as fs from 'fs'; import * as minimatch from 'minimatch'; -import * as nls from 'vscode-nls'; import { Utils } from 'vscode-uri'; import { findPreferredPM } from './preferred-pm'; import { readScripts } from './readScripts'; -const localize = nls.loadMessageBundle(); const excludeRegex = new RegExp('^(node_modules|.vscode-test)$', 'i'); export interface INpmTaskDefinition extends TaskDefinition { @@ -136,9 +134,9 @@ export async function getPackageManager(extensionContext: ExtensionContext, fold packageManagerName = name; const neverShowWarning = 'npm.multiplePMWarning.neverShow'; if (showWarning && multiplePMDetected && !extensionContext.globalState.get(neverShowWarning)) { - const multiplePMWarning = localize('npm.multiplePMWarning', 'Using {0} as the preferred package manager. Found multiple lockfiles for {1}. To resolve this issue, delete the lockfiles that don\'t match your preferred package manager or change the setting "npm.packageManager" to a value other than "auto".', packageManagerName, folder.fsPath); - const neverShowAgain = localize('npm.multiplePMWarning.doNotShow', "Do not show again"); - const learnMore = localize('npm.multiplePMWarning.learnMore', "Learn more"); + const multiplePMWarning = l10n.t('Using {0} as the preferred package manager. Found multiple lockfiles for {1}. To resolve this issue, delete the lockfiles that don\'t match your preferred package manager or change the setting "npm.packageManager" to a value other than "auto".', packageManagerName, folder.fsPath); + const neverShowAgain = l10n.t("Do not show again"); + const learnMore = l10n.t("Learn more"); window.showInformationMessage(multiplePMWarning, learnMore, neverShowAgain).then(result => { switch (result) { case neverShowAgain: extensionContext.globalState.update(neverShowWarning, true); break; @@ -447,7 +445,7 @@ export async function getScripts(packageJsonUri: Uri) { const document: TextDocument = await workspace.openTextDocument(packageJsonUri); return readScripts(document); } catch (e) { - const localizedParseError = localize('npm.parseError', 'Npm task detection: failed to parse the file {0}', packageJsonUri.fsPath); + const localizedParseError = l10n.t("Npm task detection: failed to parse the file {0}", packageJsonUri.fsPath); throw new Error(localizedParseError); } } diff --git a/extensions/npm/yarn.lock b/extensions/npm/yarn.lock index bfd3b4b3de1..081db280c9b 100644 --- a/extensions/npm/yarn.lock +++ b/extensions/npm/yarn.lock @@ -192,11 +192,6 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -vscode-nls@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-5.2.0.tgz#3cb6893dd9bd695244d8a024bdf746eea665cc3f" - integrity sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng== - which-pm@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-pm/-/which-pm-2.0.0.tgz#8245609ecfe64bf751d0eef2f376d83bf1ddb7ae" From 3c874be287c8009ccc5c1f29d43871d96ae3ce58 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Fri, 4 Nov 2022 14:04:58 -0700 Subject: [PATCH 133/185] Fix UI string (#165554) --- .../src/typescriptServiceClient.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/typescript-language-features/src/typescriptServiceClient.ts b/extensions/typescript-language-features/src/typescriptServiceClient.ts index e0b11ac2173..012942c3c55 100644 --- a/extensions/typescript-language-features/src/typescriptServiceClient.ts +++ b/extensions/typescript-language-features/src/typescriptServiceClient.ts @@ -370,7 +370,7 @@ export default class TypeScriptServiceClient extends Disposable implements IType let version = this._versionManager.currentVersion; if (!version.isValid) { - vscode.window.showWarningMessage(vscode.l10n.t("The path {0} doesn\'t point to a valid tsserver install. Falling back to bundled TypeScript version.', version.path")); + vscode.window.showWarningMessage(vscode.l10n.t("The path {0} doesn't point to a valid tsserver install. Falling back to bundled TypeScript version.", version.path)); this._versionManager.reset(); version = this._versionManager.currentVersion; @@ -481,7 +481,7 @@ export default class TypeScriptServiceClient extends Disposable implements IType public async openTsServerLogFile(): Promise { if (this._configuration.tsServerLogLevel === TsServerLogLevel.Off) { vscode.window.showErrorMessage( - vscode.l10n.t("TS Server logging is off. Please set `typescript.tsserver.log` and restart the TS server to enable logging"), + vscode.l10n.t("TS Server logging is off. Please set 'typescript.tsserver.log' and restart the TS server to enable logging"), { title: vscode.l10n.t("Enable logging and restart TS server"), }) From e3155b6041cfc3a109131e3bfe991726334041a2 Mon Sep 17 00:00:00 2001 From: Megan Rogge Date: Fri, 4 Nov 2022 14:16:59 -0700 Subject: [PATCH 134/185] add task section to terminal dropdown (#165553) --- .../dropdownWithPrimaryActionViewItem.ts | 2 +- .../contrib/terminal/browser/terminalMenus.ts | 48 ++++++++++++------- 2 files changed, 31 insertions(+), 19 deletions(-) diff --git a/src/vs/platform/actions/browser/dropdownWithPrimaryActionViewItem.ts b/src/vs/platform/actions/browser/dropdownWithPrimaryActionViewItem.ts index ec2a105e9cb..a3e7007e225 100644 --- a/src/vs/platform/actions/browser/dropdownWithPrimaryActionViewItem.ts +++ b/src/vs/platform/actions/browser/dropdownWithPrimaryActionViewItem.ts @@ -49,7 +49,7 @@ export class DropdownWithPrimaryActionViewItem extends BaseActionViewItem { this._primaryAction = new MenuEntryActionViewItem(primaryAction, undefined, _keybindingService, _notificationService, _contextKeyService, _themeService, _contextMenuProvider); this._dropdown = new DropdownMenuActionViewItem(dropdownAction, dropdownMenuActions, this._contextMenuProvider, { menuAsChild: true, - classNames: ['codicon', 'codicon-chevron-down'], + classNames: ['codicon', 'codicon-chevron-down', className], keybindingProvider: this._options?.getKeyBinding }); } diff --git a/src/vs/workbench/contrib/terminal/browser/terminalMenus.ts b/src/vs/workbench/contrib/terminal/browser/terminalMenus.ts index 3abbfe8cdc0..b2db81c3c0c 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalMenus.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalMenus.ts @@ -11,6 +11,7 @@ import { IMenu, MenuId, MenuRegistry } from 'vs/platform/actions/common/actions' import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { IExtensionTerminalProfile, ITerminalProfile, TerminalLocation, TerminalSettingId } from 'vs/platform/terminal/common/terminal'; import { ResourceContextKey } from 'vs/workbench/common/contextkeys'; +import { TaskExecutionSupportedContext } from 'vs/workbench/contrib/tasks/common/taskService'; import { ICreateTerminalOptions, ITerminalLocationOptions, ITerminalService } from 'vs/workbench/contrib/terminal/browser/terminal'; import { TerminalCommandId, TERMINAL_VIEW_ID } from 'vs/workbench/contrib/terminal/common/terminal'; import { TerminalContextKeys, TerminalContextKeyStrings } from 'vs/workbench/contrib/terminal/common/terminalContextKey'; @@ -25,12 +26,6 @@ const enum ContextMenuGroup { Config = '5_config' } -export const enum TerminalTabContextMenuGroup { - Default = '1_create_default', - Profile = '2_create_profile', - Configure = '3_configure' -} - export const enum TerminalMenuBarGroup { Create = '1_create', Run = '2_run', @@ -334,9 +329,9 @@ export function setupTerminalMenus(): void { item: { command: { id: TerminalCommandId.SelectDefaultProfile, - title: { value: localize('workbench.action.terminal.selectDefaultProfile', "Select Default Profile"), original: 'Select Default Profile' } + title: { value: localize('workbench.action.terminal.selectDefaultProfile', "Select Default Profile"), original: 'Select Default Profile' }, }, - group: TerminalTabContextMenuGroup.Configure + group: '3_configure' } }, { @@ -346,8 +341,32 @@ export function setupTerminalMenus(): void { id: TerminalCommandId.ConfigureTerminalSettings, title: localize('workbench.action.terminal.openSettings', "Configure Terminal Settings") }, - group: TerminalTabContextMenuGroup.Configure + group: '3_configure' } + }, + { + id: MenuId.TerminalNewDropdownContext, + item: { + command: { + id: 'workbench.action.tasks.runTask', + title: localize('workbench.action.tasks.runTask', "Run Task...") + }, + when: TaskExecutionSupportedContext, + group: '4_tasks', + order: 1 + }, + }, + { + id: MenuId.TerminalNewDropdownContext, + item: { + command: { + id: 'workbench.action.tasks.configureTaskRunner', + title: localize('workbench.action.tasks.configureTaskRunner', "Configure Tasks...") + }, + when: TaskExecutionSupportedContext, + group: '4_tasks', + order: 2 + }, } ] ); @@ -797,15 +816,8 @@ export function getTerminalActionBarArgs(location: ITerminalLocationOptions, pro dropdownActions.push(new SubmenuAction('split.profile', localize('splitTerminal', 'Split Terminal'), submenuActions)); dropdownActions.push(new Separator()); } - - for (const [, configureActions] of dropdownMenu.getActions()) { - for (const action of configureActions) { - // make sure the action is a MenuItemAction - if ('alt' in action) { - dropdownActions.push(action); - } - } - } + const actions = dropdownMenu.getActions(); + dropdownActions.push(...Separator.join(...actions.map(a => a[1]))); const defaultSubmenuProfileAction = submenuActions.find(d => d.label.endsWith('(Default)')); if (defaultSubmenuProfileAction) { From 4a5d5018d8afafcc35060affe3ff7fadda8ddaf9 Mon Sep 17 00:00:00 2001 From: bhavyaus Date: Fri, 4 Nov 2022 14:17:52 -0700 Subject: [PATCH 135/185] Update role and aria-label for the Hide button in the Welcome View (#165505) Update role and aria-label for the Hide button --- .../contrib/welcomeGettingStarted/browser/gettingStarted.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.ts b/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.ts index 4ff980cea0c..95566ec9cab 100644 --- a/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.ts +++ b/src/vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.ts @@ -990,6 +990,8 @@ export class GettingStartedPage extends EditorPane { 'tabindex': 0, 'x-dispatch': 'hideCategory:' + category.id, 'title': localize('close', "Hide"), + 'role': 'button', + 'aria-label': localize('closeAriaLabel', "Hide"), }), ), descriptionContent, From 9b6017a2e8e9492d73d0a2f4612492dd06dd5c84 Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Fri, 4 Nov 2022 22:29:30 +0100 Subject: [PATCH 136/185] Checkbox is hard to see in dark mode on selected file change node in tree view (#165556) Fixes #163881 --- src/vs/platform/theme/common/colorRegistry.ts | 13 +++++++++---- .../workbench/browser/parts/views/media/views.css | 5 +++++ 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/vs/platform/theme/common/colorRegistry.ts b/src/vs/platform/theme/common/colorRegistry.ts index ff92332f808..e9ab3704a2f 100644 --- a/src/vs/platform/theme/common/colorRegistry.ts +++ b/src/vs/platform/theme/common/colorRegistry.ts @@ -265,10 +265,6 @@ export const selectListBackground = registerColor('dropdown.listBackground', { d export const selectForeground = registerColor('dropdown.foreground', { dark: '#F0F0F0', light: null, hcDark: Color.white, hcLight: foreground }, nls.localize('dropdownForeground', "Dropdown foreground.")); export const selectBorder = registerColor('dropdown.border', { dark: selectBackground, light: '#CECECE', hcDark: contrastBorder, hcLight: contrastBorder }, nls.localize('dropdownBorder', "Dropdown border.")); -export const checkboxBackground = registerColor('checkbox.background', { dark: selectBackground, light: selectBackground, hcDark: selectBackground, hcLight: selectBackground }, nls.localize('checkbox.background', "Background color of checkbox widget.")); -export const checkboxForeground = registerColor('checkbox.foreground', { dark: selectForeground, light: selectForeground, hcDark: selectForeground, hcLight: selectForeground }, nls.localize('checkbox.foreground', "Foreground color of checkbox widget.")); -export const checkboxBorder = registerColor('checkbox.border', { dark: selectBorder, light: selectBorder, hcDark: selectBorder, hcLight: selectBorder }, nls.localize('checkbox.border', "Border color of checkbox widget.")); - export const buttonForeground = registerColor('button.foreground', { dark: Color.white, light: Color.white, hcDark: Color.white, hcLight: Color.white }, nls.localize('buttonForeground', "Button foreground color.")); export const buttonSeparator = registerColor('button.separator', { dark: transparent(buttonForeground, .4), light: transparent(buttonForeground, .4), hcDark: transparent(buttonForeground, .4), hcLight: transparent(buttonForeground, .4) }, nls.localize('buttonSeparator', "Button separator color.")); export const buttonBackground = registerColor('button.background', { dark: '#0E639C', light: '#007ACC', hcDark: null, hcLight: '#0F4A85' }, nls.localize('buttonBackground', "Button background color.")); @@ -462,6 +458,15 @@ export const tableColumnsBorder = registerColor('tree.tableColumnsBorder', { dar export const tableOddRowsBackgroundColor = registerColor('tree.tableOddRowsBackground', { dark: transparent(foreground, 0.04), light: transparent(foreground, 0.04), hcDark: null, hcLight: null }, nls.localize('tableOddRowsBackgroundColor', "Background color for odd table rows.")); export const listDeemphasizedForeground = registerColor('list.deemphasizedForeground', { dark: '#8C8C8C', light: '#8E8E90', hcDark: '#A7A8A9', hcLight: '#666666' }, nls.localize('listDeemphasizedForeground', "List/Tree foreground color for items that are deemphasized. ")); +/** + * Checkboxes + */ +export const checkboxBackground = registerColor('checkbox.background', { dark: selectBackground, light: selectBackground, hcDark: selectBackground, hcLight: selectBackground }, nls.localize('checkbox.background', "Background color of checkbox widget.")); +export const checkboxSelectBackground = registerColor('checkbox.selectBackground', { dark: editorWidgetBackground, light: editorWidgetBackground, hcDark: editorWidgetBackground, hcLight: editorWidgetBackground }, nls.localize('checkbox.select.background', "Background color of checkbox widget when the element it's in is selected.")); +export const checkboxForeground = registerColor('checkbox.foreground', { dark: selectForeground, light: selectForeground, hcDark: selectForeground, hcLight: selectForeground }, nls.localize('checkbox.foreground', "Foreground color of checkbox widget.")); +export const checkboxBorder = registerColor('checkbox.border', { dark: selectBorder, light: selectBorder, hcDark: selectBorder, hcLight: selectBorder }, nls.localize('checkbox.border', "Border color of checkbox widget.")); +export const checkboxSelectBorder = registerColor('checkbox.selectBorder', { dark: editorWidgetBackground, light: editorWidgetBackground, hcDark: editorWidgetBackground, hcLight: editorWidgetBackground }, nls.localize('checkbox.select.border', "Border color of checkbox widget when the element it's in is selected.")); + /** * Quick pick widget (dependent on List and tree colors) */ diff --git a/src/vs/workbench/browser/parts/views/media/views.css b/src/vs/workbench/browser/parts/views/media/views.css index df9b41cafaf..2b6c61184a9 100644 --- a/src/vs/workbench/browser/parts/views/media/views.css +++ b/src/vs/workbench/browser/parts/views/media/views.css @@ -121,6 +121,11 @@ padding-left: 3px; } +.customview-tree .monaco-list .monaco-list-row.selected .custom-view-tree-node-item .custom-view-tree-node-item-checkbox { + background-color: var(--vscode-checkbox-selectBackground); + border: 1px solid var(--vscode-checkbox-selectBorder); +} + .customview-tree .monaco-list .monaco-list-row .custom-view-tree-node-item .custom-view-tree-node-item-checkbox { width: 16px; height: 16px; From 9cf70946b6d596c3fb018b317648b4ce7ff3b1ad Mon Sep 17 00:00:00 2001 From: SteVen Batten <6561887+sbatten@users.noreply.github.com> Date: Fri, 4 Nov 2022 14:33:25 -0700 Subject: [PATCH 137/185] don't show title bar context on cmd (#165557) fixes #165545 --- src/vs/workbench/browser/parts/titlebar/titlebarPart.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts b/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts index f2e4b9fba37..dc07d429216 100644 --- a/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts +++ b/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts @@ -285,7 +285,7 @@ export class TitlebarPart extends Part implements ITitleService { // Context menu on title [EventType.CONTEXT_MENU, EventType.MOUSE_DOWN].forEach(event => { this._register(addDisposableListener(this.rootContainer, event, e => { - if (e.type === EventType.CONTEXT_MENU || e.metaKey) { + if (e.type === EventType.CONTEXT_MENU || (e.target === this.title && e.metaKey)) { EventHelper.stop(e); this.onContextMenu(e, e.target === this.title ? MenuId.TitleBarTitleContext : MenuId.TitleBarContext); } From 285c6075c483afff5f38504336763af382b83737 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Fri, 4 Nov 2022 14:41:27 -0700 Subject: [PATCH 138/185] Remove executePrimary and notebookEditor proposal (#165532) Fix #164505 --- .../services/actions/common/menusExtensionPoint.ts | 6 ------ .../extensions/common/extensionsApiProposals.ts | 1 - src/vscode-dts/vscode.proposed.notebookEditor.d.ts | 12 ------------ 3 files changed, 19 deletions(-) delete mode 100644 src/vscode-dts/vscode.proposed.notebookEditor.d.ts diff --git a/src/vs/workbench/services/actions/common/menusExtensionPoint.ts b/src/vs/workbench/services/actions/common/menusExtensionPoint.ts index bd6abb41e08..4e2614f007c 100644 --- a/src/vs/workbench/services/actions/common/menusExtensionPoint.ts +++ b/src/vs/workbench/services/actions/common/menusExtensionPoint.ts @@ -203,12 +203,6 @@ const apiMenus: IAPIMenu[] = [ id: MenuId.NotebookCellExecute, description: localize('notebook.cell.execute', "The contributed notebook cell execution menu") }, - { - key: 'notebook/cell/executePrimary', - id: MenuId.NotebookCellExecutePrimary, - description: localize('notebook.cell.executePrimary', "The contributed primary notebook cell execution button"), - proposed: 'notebookEditor' - }, { key: 'interactive/toolbar', id: MenuId.InteractiveToolbar, diff --git a/src/vs/workbench/services/extensions/common/extensionsApiProposals.ts b/src/vs/workbench/services/extensions/common/extensionsApiProposals.ts index 533692c95d0..2bdb8476968 100644 --- a/src/vs/workbench/services/extensions/common/extensionsApiProposals.ts +++ b/src/vs/workbench/services/extensions/common/extensionsApiProposals.ts @@ -43,7 +43,6 @@ export const allApiProposals = Object.freeze({ notebookControllerAffinityHidden: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.notebookControllerAffinityHidden.d.ts', notebookControllerKind: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.notebookControllerKind.d.ts', notebookDeprecated: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.notebookDeprecated.d.ts', - notebookEditor: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.notebookEditor.d.ts', notebookKernelSource: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.notebookKernelSource.d.ts', notebookLiveShare: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.notebookLiveShare.d.ts', notebookMessaging: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.notebookMessaging.d.ts', diff --git a/src/vscode-dts/vscode.proposed.notebookEditor.d.ts b/src/vscode-dts/vscode.proposed.notebookEditor.d.ts deleted file mode 100644 index 4fdecf183df..00000000000 --- a/src/vscode-dts/vscode.proposed.notebookEditor.d.ts +++ /dev/null @@ -1,12 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -declare module 'vscode' { - - // https://github.com/microsoft/vscode/issues/149271 - - // ❗️ Important: The main NotebookEditor api has been finalized. - // This file only tracks the `notebook/cell/executePrimary` contribution, which will be removed -} From 6621cfa2e86da69462adf9b59d81e6b79bc09496 Mon Sep 17 00:00:00 2001 From: SteVen Batten <6561887+sbatten@users.noreply.github.com> Date: Fri, 4 Nov 2022 14:46:21 -0700 Subject: [PATCH 139/185] treat editor tab ctrl+click as right click (#165558) fixes #160413 --- src/vs/workbench/browser/parts/editor/editorGroupView.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/browser/parts/editor/editorGroupView.ts b/src/vs/workbench/browser/parts/editor/editorGroupView.ts index 42574d698a7..55a84735955 100644 --- a/src/vs/workbench/browser/parts/editor/editorGroupView.ts +++ b/src/vs/workbench/browser/parts/editor/editorGroupView.ts @@ -50,7 +50,7 @@ import { IFilesConfigurationService, AutoSaveMode } from 'vs/workbench/services/ import { withNullAsUndefined } from 'vs/base/common/types'; import { URI } from 'vs/base/common/uri'; import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; -import { isLinux, isNative, isWindows } from 'vs/base/common/platform'; +import { isLinux, isMacintosh, isNative, isWindows } from 'vs/base/common/platform'; import { ILogService } from 'vs/platform/log/common/log'; import { getProgressBarStyles } from 'vs/platform/theme/browser/defaultStyles'; @@ -404,8 +404,8 @@ export class EditorGroupView extends Themable implements IEditorGroupView { const handleTitleClickOrTouch = (e: MouseEvent | GestureEvent): void => { let target: HTMLElement; if (e instanceof MouseEvent) { - if (e.button !== 0) { - return undefined; // only for left mouse click + if (e.button !== 0 || (isMacintosh && e.ctrlKey)) { + return undefined; // only for left mouse click (ctrl+click on macos is right-click) } target = e.target as HTMLElement; From 3bd1ecde90a8864a0a5f78f3393b782e8eb42dd2 Mon Sep 17 00:00:00 2001 From: Gaurav Bhagchandani Date: Fri, 4 Nov 2022 15:56:30 -0700 Subject: [PATCH 140/185] Use css variables for editor scrollbar (#165464) Co-authored-by: gcb4 --- .../browser/ui/scrollbar/media/scrollbars.css | 15 ++++++ .../editorScrollbar/editorScrollbar.ts | 52 +------------------ 2 files changed, 16 insertions(+), 51 deletions(-) diff --git a/src/vs/base/browser/ui/scrollbar/media/scrollbars.css b/src/vs/base/browser/ui/scrollbar/media/scrollbars.css index d50aa58526c..eaceedb9fed 100644 --- a/src/vs/base/browser/ui/scrollbar/media/scrollbars.css +++ b/src/vs/base/browser/ui/scrollbar/media/scrollbars.css @@ -36,6 +36,7 @@ left: 3px; height: 3px; width: 100%; + box-shadow: var(--vscode-scrollbar-shadow) 0 6px 6px -6px inset; } .monaco-scrollable-element > .shadow.left { display: block; @@ -43,6 +44,7 @@ left: 0; height: 100%; width: 3px; + box-shadow: var(--vscode-scrollbar-shadow) 6px 0 6px -6px inset; } .monaco-scrollable-element > .shadow.top-left-corner { display: block; @@ -50,4 +52,17 @@ left: 0; height: 3px; width: 3px; + box-shadow: var(--vscode-scrollbar-shadow) 6px 0 6px -6px inset; +} + +.monaco-scrollable-element > .scrollbar > .slider { + background: var(--vscode-scrollbarSlider-background); +} + +.monaco-scrollable-element > .scrollbar > .slider:hover { + background: var(--vscode-scrollbarSlider-hoverBackground); +} + +.monaco-scrollable-element > .scrollbar > .slider.active { + background: var(--vscode-scrollbarSlider-activeBackground); } diff --git a/src/vs/editor/browser/viewParts/editorScrollbar/editorScrollbar.ts b/src/vs/editor/browser/viewParts/editorScrollbar/editorScrollbar.ts index 04d9e42787b..597eaec3166 100644 --- a/src/vs/editor/browser/viewParts/editorScrollbar/editorScrollbar.ts +++ b/src/vs/editor/browser/viewParts/editorScrollbar/editorScrollbar.ts @@ -12,10 +12,8 @@ import { INewScrollPosition, ScrollType } from 'vs/editor/common/editorCommon'; import { RenderingContext, RestrictedRenderingContext } from 'vs/editor/browser/view/renderingContext'; import { ViewContext } from 'vs/editor/common/viewModel/viewContext'; import * as viewEvents from 'vs/editor/common/viewEvents'; -import { registerThemingParticipant, getThemeTypeSelector } from 'vs/platform/theme/common/themeService'; +import { getThemeTypeSelector } from 'vs/platform/theme/common/themeService'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; -import { scrollbarShadow, scrollbarSliderActiveBackground, scrollbarSliderBackground, scrollbarSliderHoverBackground } from 'vs/platform/theme/common/colorRegistry'; - export class EditorScrollbar extends ViewPart { private readonly scrollbar: SmoothScrollableElement; @@ -180,51 +178,3 @@ export class EditorScrollbar extends ViewPart { this.scrollbar.renderNow(); } } - -registerThemingParticipant((theme, collector) => { - - // Scrollbars - const scrollbarShadowColor = theme.getColor(scrollbarShadow); - if (scrollbarShadowColor) { - collector.addRule(` - .monaco-scrollable-element > .shadow.top { - box-shadow: ${scrollbarShadowColor} 0 6px 6px -6px inset; - } - - .monaco-scrollable-element > .shadow.left { - box-shadow: ${scrollbarShadowColor} 6px 0 6px -6px inset; - } - - .monaco-scrollable-element > .shadow.top.left { - box-shadow: ${scrollbarShadowColor} 6px 6px 6px -6px inset; - } - `); - } - - const scrollbarSliderBackgroundColor = theme.getColor(scrollbarSliderBackground); - if (scrollbarSliderBackgroundColor) { - collector.addRule(` - .monaco-scrollable-element > .scrollbar > .slider { - background: ${scrollbarSliderBackgroundColor}; - } - `); - } - - const scrollbarSliderHoverBackgroundColor = theme.getColor(scrollbarSliderHoverBackground); - if (scrollbarSliderHoverBackgroundColor) { - collector.addRule(` - .monaco-scrollable-element > .scrollbar > .slider:hover { - background: ${scrollbarSliderHoverBackgroundColor}; - } - `); - } - - const scrollbarSliderActiveBackgroundColor = theme.getColor(scrollbarSliderActiveBackground); - if (scrollbarSliderActiveBackgroundColor) { - collector.addRule(` - .monaco-scrollable-element > .scrollbar > .slider.active { - background: ${scrollbarSliderActiveBackgroundColor}; - } - `); - } -}); From 248d1a6daed8eb853a69d77cccbbbecee235a106 Mon Sep 17 00:00:00 2001 From: Megan Rogge Date: Fri, 4 Nov 2022 15:57:21 -0700 Subject: [PATCH 141/185] check if a task run is in progress before running it (#165560) --- .../contrib/tasks/browser/abstractTaskService.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts b/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts index 6e2ef078aae..da9c552689c 100644 --- a/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts +++ b/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts @@ -218,6 +218,8 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer protected _taskRunningState: IContextKey; + private _inProgressTasks: Set = new Set(); + protected _outputChannel: IOutputChannel; protected readonly _onDidStateChange: Emitter; private _waitForSupportedExecutions: Promise; @@ -1203,6 +1205,11 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer if (!task) { throw new TaskError(Severity.Info, nls.localize('TaskServer.noTask', 'Task to execute is undefined'), TaskErrors.TaskNotFound); } + if (this._inProgressTasks.has(task._label)) { + this._logService.info('Prevented duplicate task from running', task._label); + return; + } + this._inProgressTasks.add(task._label); const resolver = this._createResolver(); let executeTaskResult: ITaskSummary | undefined; try { @@ -1218,6 +1225,8 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer } catch (error) { this._handleError(error); return Promise.reject(error); + } finally { + this._inProgressTasks.delete(task._label); } } From 0bc46822397eed7221ced32b1e44b86101e18cc9 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Fri, 4 Nov 2022 16:02:01 -0700 Subject: [PATCH 142/185] Pick up latest TS for building VS Code (#165562) --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index c5892334cf2..ed6145dfcd6 100644 --- a/package.json +++ b/package.json @@ -207,7 +207,7 @@ "ts-loader": "^9.2.7", "ts-node": "^10.9.1", "tsec": "0.1.4", - "typescript": "^4.9.0-dev.20221031", + "typescript": "^5.0.0-dev.20221103", "typescript-formatter": "7.1.0", "underscore": "^1.12.1", "util": "^0.12.4", diff --git a/yarn.lock b/yarn.lock index 354d4ce9ee4..19a83624cc3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10852,10 +10852,10 @@ typescript@^4.7.4: resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.8.4.tgz#c464abca159669597be5f96b8943500b238e60e6" integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ== -typescript@^4.9.0-dev.20221031: - version "4.9.0-dev.20221031" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.0-dev.20221031.tgz#bf032089b6337a96a9de6de4fcce074a305ee14d" - integrity sha512-jCNHTa9twe5d/5Pfob2BhOLwHS6kxMcGyc3fIWDGGkEdkyYYbiXD2czz1U6jVOB+9QaVxVNUQuDfN42H5DGZZg== +typescript@^5.0.0-dev.20221103: + version "5.0.0-dev.20221103" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.0.0-dev.20221103.tgz#673cc041603bb7faed88f41ca5e9481c678f33d8" + integrity sha512-hfqcsmiJ+5ktli1OAkwu4PyDDJ3kWW3tiUofd2t1uxwmni3ZT3Mrv1m2dZFg9VNDKqHrkt49izB3tAtD2bsyGw== typical@^4.0.0: version "4.0.0" From 12d266082633bb63fa1f4f50b50f6c96560b61ad Mon Sep 17 00:00:00 2001 From: Raymond Zhao <7199958+rzhao271@users.noreply.github.com> Date: Fri, 4 Nov 2022 16:06:26 -0700 Subject: [PATCH 143/185] Refactor sash hover border to use CSS var (#165516) Ref #165169 --- src/vs/base/browser/ui/sash/sash.css | 5 +++++ .../contrib/sash/browser/sash.contribution.ts | 12 ------------ 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/src/vs/base/browser/ui/sash/sash.css b/src/vs/base/browser/ui/sash/sash.css index 11cd5172cdc..30a97495079 100644 --- a/src/vs/base/browser/ui/sash/sash.css +++ b/src/vs/base/browser/ui/sash/sash.css @@ -111,6 +111,11 @@ background: transparent; } +.monaco-sash.hover:before, +.monaco-sash.active:before { + background: var(--vscode-sash-hoverBorder); +} + .monaco-sash.vertical:before { width: var(--sash-hover-size); left: calc(50% - (var(--sash-hover-size) / 2)); diff --git a/src/vs/workbench/contrib/sash/browser/sash.contribution.ts b/src/vs/workbench/contrib/sash/browser/sash.contribution.ts index ca2bbe1d72b..74593875a3e 100644 --- a/src/vs/workbench/contrib/sash/browser/sash.contribution.ts +++ b/src/vs/workbench/contrib/sash/browser/sash.contribution.ts @@ -10,8 +10,6 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { workbenchConfigurationNodeBase } from 'vs/workbench/common/configuration'; import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions } from 'vs/workbench/common/contributions'; import { SashSettingsController } from 'vs/workbench/contrib/sash/browser/sash'; -import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; -import { sashHoverBorder } from 'vs/platform/theme/common/colorRegistry'; import { isIOS } from 'vs/base/common/platform'; // Sash size contribution @@ -39,13 +37,3 @@ Registry.as(ConfigurationExtensions.Configuration) }, } }); - -registerThemingParticipant((theme, collector) => { - const sashHoverBorderColor = theme.getColor(sashHoverBorder); - collector.addRule(` - .monaco-sash.hover:before, - .monaco-sash.active:before { - background: ${sashHoverBorderColor}; - } - `); -}); From 647185251ceff3a135edbae79f162ff899e01a6d Mon Sep 17 00:00:00 2001 From: SteVen Batten <6561887+sbatten@users.noreply.github.com> Date: Fri, 4 Nov 2022 16:11:26 -0700 Subject: [PATCH 144/185] adopt css var in lieu of registerThemingParticipant (#165561) * panel and auxiliar bar part css refs #165169 * unused imports --- .../parts/auxiliarybar/auxiliaryBarPart.ts | 66 +------------ .../auxiliarybar/media/auxiliaryBarPart.css | 20 ++++ .../browser/parts/panel/media/panelpart.css | 39 ++++++++ .../browser/parts/panel/panelPart.ts | 93 +------------------ 4 files changed, 65 insertions(+), 153 deletions(-) diff --git a/src/vs/workbench/browser/parts/auxiliarybar/auxiliaryBarPart.ts b/src/vs/workbench/browser/parts/auxiliarybar/auxiliaryBarPart.ts index ded68cd9bbf..5daba48b778 100644 --- a/src/vs/workbench/browser/parts/auxiliarybar/auxiliaryBarPart.ts +++ b/src/vs/workbench/browser/parts/auxiliarybar/auxiliaryBarPart.ts @@ -12,12 +12,12 @@ import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { IStorageService } from 'vs/platform/storage/common/storage'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { activeContrastBorder, contrastBorder, editorBackground } from 'vs/platform/theme/common/colorRegistry'; -import { IThemeService, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; +import { contrastBorder } from 'vs/platform/theme/common/colorRegistry'; +import { IThemeService } from 'vs/platform/theme/common/themeService'; import { Extensions as PaneCompositeExtensions } from 'vs/workbench/browser/panecomposite'; import { BasePanelPart } from 'vs/workbench/browser/parts/panel/panelPart'; import { ActiveAuxiliaryContext, AuxiliaryBarFocusContext } from 'vs/workbench/common/contextkeys'; -import { SIDE_BAR_BACKGROUND, SIDE_BAR_BORDER, SIDE_BAR_FOREGROUND, SIDE_BAR_TITLE_FOREGROUND } from 'vs/workbench/common/theme'; +import { SIDE_BAR_BACKGROUND, SIDE_BAR_BORDER, SIDE_BAR_FOREGROUND } from 'vs/workbench/common/theme'; import { IViewDescriptorService, ViewContainerLocation } from 'vs/workbench/common/views'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { IWorkbenchLayoutService, Parts, Position } from 'vs/workbench/services/layout/browser/layoutService'; @@ -126,63 +126,3 @@ export class AuxiliaryBarPart extends BasePanelPart { }; } } - -registerThemingParticipant((theme, collector) => { - - // Auxiliary Bar Background: since panels can host editors, we apply a background rule if the panel background - // color is different from the editor background color. This is a bit of a hack though. The better way - // would be to have a way to push the background color onto each editor widget itself somehow. - const auxiliaryBarBackground = theme.getColor(SIDE_BAR_BACKGROUND); - if (auxiliaryBarBackground && auxiliaryBarBackground !== theme.getColor(editorBackground)) { - collector.addRule(` - .monaco-workbench .part.auxiliarybar > .content .monaco-editor, - .monaco-workbench .part.auxiliarybar > .content .monaco-editor .margin, - .monaco-workbench .part.auxiliarybar > .content .monaco-editor .monaco-editor-background { - background-color: ${auxiliaryBarBackground}; - } - `); - } - - // Title Active - const titleActive = theme.getColor(SIDE_BAR_TITLE_FOREGROUND); - if (titleActive) { - collector.addRule(` - .monaco-workbench .part.auxiliarybar > .title > .panel-switcher-container > .monaco-action-bar .action-item:hover .action-label { - color: ${titleActive} !important; - } - `); - collector.addRule(` - .monaco-workbench .part.auxiliarybar > .title > .panel-switcher-container > .monaco-action-bar .action-item:focus .action-label { - color: ${titleActive} !important; - } - `); - } - - // Styling with Outline color (e.g. high contrast theme) - const outline = theme.getColor(activeContrastBorder); - if (outline) { - collector.addRule(` - .monaco-workbench .part.auxiliarybar > .title > .panel-switcher-container > .monaco-action-bar .action-item.checked .action-label, - .monaco-workbench .part.auxiliarybar > .title > .panel-switcher-container > .monaco-action-bar .action-item:hover .action-label { - outline-color: ${outline}; - outline-width: 1px; - outline-style: solid; - border-bottom: none; - outline-offset: -2px; - } - - .monaco-workbench .part.auxiliarybar > .title > .panel-switcher-container > .monaco-action-bar .action-item:not(.checked):hover .action-label { - outline-style: dashed; - } - `); - } - - // const inputBorder = theme.getColor(PANEL_INPUT_BORDER); - // if (inputBorder) { - // collector.addRule(` - // .monaco-workbench .part.auxiliarybar .monaco-inputbox { - // border-color: ${inputBorder} - // } - // `); - // } -}); diff --git a/src/vs/workbench/browser/parts/auxiliarybar/media/auxiliaryBarPart.css b/src/vs/workbench/browser/parts/auxiliarybar/media/auxiliaryBarPart.css index c71b8c2f5dd..74dbd62f7c0 100644 --- a/src/vs/workbench/browser/parts/auxiliarybar/media/auxiliaryBarPart.css +++ b/src/vs/workbench/browser/parts/auxiliarybar/media/auxiliaryBarPart.css @@ -7,3 +7,23 @@ display: none !important; visibility: hidden !important; } + +.monaco-workbench .part.auxiliarybar > .content .monaco-editor, +.monaco-workbench .part.auxiliarybar > .content .monaco-editor .margin, +.monaco-workbench .part.auxiliarybar > .content .monaco-editor .monaco-editor-background { + background-color: var(--vscode-sideBar-background) !important; +} + +.monaco-workbench .part.auxiliarybar > .title > .panel-switcher-container > .monaco-action-bar .action-item:hover .action-label, +.monaco-workbench .part.auxiliarybar > .title > .panel-switcher-container > .monaco-action-bar .action-item:focus .action-label { + color: var(--vscode-sideBarTitle-foreground) !important; +} + +.monaco-workbench .part.auxiliarybar > .title > .panel-switcher-container > .monaco-action-bar .action-item.checked .action-label, +.monaco-workbench .part.auxiliarybar > .title > .panel-switcher-container > .monaco-action-bar .action-item:hover .action-label { + outline: var(--vscode-contrastActiveBorder, unset) solid 1px !important; +} + +.monaco-workbench .part.auxiliarybar > .title > .panel-switcher-container > .monaco-action-bar .action-item:not(.checked):hover .action-label { + outline: var(--vscode-contrastActiveBorder, unset) dashed 1px !important; +} diff --git a/src/vs/workbench/browser/parts/panel/media/panelpart.css b/src/vs/workbench/browser/parts/panel/media/panelpart.css index b5498e12048..846ca54ebd3 100644 --- a/src/vs/workbench/browser/parts/panel/media/panelpart.css +++ b/src/vs/workbench/browser/parts/panel/media/panelpart.css @@ -34,3 +34,42 @@ .monaco-workbench.noeditorarea .part.panel.left { border-right-width: 0; /* no border when editor area is hiden */ } + +.monaco-workbench .part.panel > .content .monaco-editor, +.monaco-workbench .part.panel > .content .monaco-editor .margin, +.monaco-workbench .part.panel > .content .monaco-editor .monaco-editor-background { + background-color: var(--vscode-panel-background) !important; +} + +.monaco-workbench .part.panel > .title > .panel-switcher-container > .monaco-action-bar .action-item:focus .action-label, +.monaco-workbench .part.panel > .title > .panel-switcher-container > .monaco-action-bar .action-item:hover .action-label { + color: var(--vscode-panelTitle-activeForeground) !important; +} + +.monaco-workbench .part.panel .monaco-inputbox { + border-color: var(--vscode-panelInput-border) !important; +} + +.monaco-workbench .part.basepanel > .title > .panel-switcher-container > .monaco-action-bar .action-item:focus .active-item-indicator:before { + border-top-color: var(--vscode-focusBorder) !important; +} + +.monaco-workbench .part.panel > .title > .panel-switcher-container > .monaco-action-bar .action-item:focus { + outline: none; +} + +.monaco-workbench .part.basepanel > .title > .panel-switcher-container > .monaco-action-bar .action-item.checked:not(:focus) .active-item-indicator:before, +.monaco-workbench .part.basepanel > .title > .panel-switcher-container > .monaco-action-bar .action-item.checked.clicked:focus .active-item-indicator:before { + border-top-color: var(--vscode-panelTitle-activeBorder) !important; +} + +.monaco-workbench .part.basepanel > .title > .panel-switcher-container > .monaco-action-bar .action-item.checked .action-label, +.monaco-workbench .part.basepanel > .title > .panel-switcher-container > .monaco-action-bar .action-item:hover .action-label { + outline: var(--vscode-contrastActiveBorder, unset) solid 1px !important; +} + +.monaco-workbench .part.basepanel > .title > .panel-switcher-container > .monaco-action-bar .action-item:not(.checked):hover .action-label { + outline: var(--vscode-contrastActiveBorder, unset) dashed 1px !important; +} + + diff --git a/src/vs/workbench/browser/parts/panel/panelPart.ts b/src/vs/workbench/browser/parts/panel/panelPart.ts index a0c8283723b..513e653171a 100644 --- a/src/vs/workbench/browser/parts/panel/panelPart.ts +++ b/src/vs/workbench/browser/parts/panel/panelPart.ts @@ -19,9 +19,9 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { PanelActivityAction, TogglePanelAction, PlaceHolderPanelActivityAction, PlaceHolderToggleCompositePinnedAction, PositionPanelActionConfigs, SetPanelPositionAction } from 'vs/workbench/browser/parts/panel/panelActions'; -import { IThemeService, registerThemingParticipant, ThemeIcon } from 'vs/platform/theme/common/themeService'; -import { PANEL_BACKGROUND, PANEL_BORDER, PANEL_ACTIVE_TITLE_FOREGROUND, PANEL_INACTIVE_TITLE_FOREGROUND, PANEL_ACTIVE_TITLE_BORDER, PANEL_INPUT_BORDER, EDITOR_DRAG_AND_DROP_BACKGROUND, PANEL_DRAG_AND_DROP_BORDER } from 'vs/workbench/common/theme'; -import { activeContrastBorder, focusBorder, contrastBorder, editorBackground, badgeBackground, badgeForeground } from 'vs/platform/theme/common/colorRegistry'; +import { IThemeService, ThemeIcon } from 'vs/platform/theme/common/themeService'; +import { PANEL_BACKGROUND, PANEL_BORDER, PANEL_ACTIVE_TITLE_FOREGROUND, PANEL_INACTIVE_TITLE_FOREGROUND, PANEL_ACTIVE_TITLE_BORDER, EDITOR_DRAG_AND_DROP_BACKGROUND, PANEL_DRAG_AND_DROP_BORDER } from 'vs/workbench/common/theme'; +import { contrastBorder, badgeBackground, badgeForeground } from 'vs/platform/theme/common/colorRegistry'; import { CompositeBar, ICompositeBarItem, CompositeDragAndDrop } from 'vs/workbench/browser/parts/compositeBar'; import { IActivityHoverOptions, ToggleCompositePinnedAction } from 'vs/workbench/browser/parts/compositeBarActions'; import { IBadge } from 'vs/workbench/services/activity/common/activity'; @@ -1008,90 +1008,3 @@ export class PanelPart extends BasePanelPart { }; } } - -registerThemingParticipant((theme, collector) => { - - // Panel Background: since panels can host editors, we apply a background rule if the panel background - // color is different from the editor background color. This is a bit of a hack though. The better way - // would be to have a way to push the background color onto each editor widget itself somehow. - const panelBackground = theme.getColor(PANEL_BACKGROUND); - if (panelBackground && panelBackground !== theme.getColor(editorBackground)) { - collector.addRule(` - .monaco-workbench .part.panel > .content .monaco-editor, - .monaco-workbench .part.panel > .content .monaco-editor .margin, - .monaco-workbench .part.panel > .content .monaco-editor .monaco-editor-background { - background-color: ${panelBackground}; - } - `); - } - - // Title Active - const titleActive = theme.getColor(PANEL_ACTIVE_TITLE_FOREGROUND); - if (titleActive) { - collector.addRule(` - .monaco-workbench .part.panel > .title > .panel-switcher-container > .monaco-action-bar .action-item:hover .action-label { - color: ${titleActive} !important; - } - `); - collector.addRule(` - .monaco-workbench .part.panel > .title > .panel-switcher-container > .monaco-action-bar .action-item:focus .action-label { - color: ${titleActive} !important; - } - `); - } - - const inputBorder = theme.getColor(PANEL_INPUT_BORDER); - if (inputBorder) { - collector.addRule(` - .monaco-workbench .part.panel .monaco-inputbox { - border-color: ${inputBorder} - } - `); - } - - - // Base Panel Styles - // Title focus - const focusBorderColor = theme.getColor(focusBorder); - if (focusBorderColor) { - collector.addRule(` - .monaco-workbench .part.basepanel > .title > .panel-switcher-container > .monaco-action-bar .action-item:focus .active-item-indicator:before { - border-top-color: ${focusBorderColor}; - } - `); - collector.addRule(` - .monaco-workbench .part.panel > .title > .panel-switcher-container > .monaco-action-bar .action-item:focus { - outline: none; - } - `); - } - - const titleActiveBorder = theme.getColor(PANEL_ACTIVE_TITLE_BORDER); - if (titleActiveBorder) { - collector.addRule(` - .monaco-workbench .part.basepanel > .title > .panel-switcher-container > .monaco-action-bar .action-item.checked:not(:focus) .active-item-indicator:before, - .monaco-workbench .part.basepanel > .title > .panel-switcher-container > .monaco-action-bar .action-item.checked.clicked:focus .active-item-indicator:before { - border-top-color: ${titleActiveBorder}; - } - `); - } - - // Styling with Outline color (e.g. high contrast theme) - const outline = theme.getColor(activeContrastBorder); - if (outline) { - collector.addRule(` - .monaco-workbench .part.basepanel > .title > .panel-switcher-container > .monaco-action-bar .action-item.checked .action-label, - .monaco-workbench .part.basepanel > .title > .panel-switcher-container > .monaco-action-bar .action-item:hover .action-label { - outline-color: ${outline}; - outline-width: 1px; - outline-style: solid; - border-bottom: none; - outline-offset: -1px; - } - - .monaco-workbench .part.basepanel > .title > .panel-switcher-container > .monaco-action-bar .action-item:not(.checked):hover .action-label { - outline-style: dashed; - } - `); - } -}); From 21e77708922cdd38b1dfcf3b071816658c366ef6 Mon Sep 17 00:00:00 2001 From: Raymond Zhao <7199958+rzhao271@users.noreply.github.com> Date: Fri, 4 Nov 2022 16:24:09 -0700 Subject: [PATCH 145/185] Increase min-height to 100% (#165566) Fixes #165518 --- .../contrib/preferences/browser/media/settingsEditor2.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/preferences/browser/media/settingsEditor2.css b/src/vs/workbench/contrib/preferences/browser/media/settingsEditor2.css index d1b93b033a6..b7a87ddd56e 100644 --- a/src/vs/workbench/contrib/preferences/browser/media/settingsEditor2.css +++ b/src/vs/workbench/contrib/preferences/browser/media/settingsEditor2.css @@ -324,7 +324,7 @@ } .settings-editor > .settings-body .settings-tree-container .monaco-list-rows { - min-height: 175px; /* Avoid the hover being cut off. See #164602 */ + min-height: 100%; /* Avoid the hover being cut off. See #164602 and #165518 */ overflow: visible !important; /* Allow validation errors to flow out of the tree container. Override inline style from ScrollableElement. */ } From 62ee5bfb86660aef86850516ff81ac2c681194a6 Mon Sep 17 00:00:00 2001 From: Tyler James Leonhardt Date: Fri, 4 Nov 2022 16:35:04 -0700 Subject: [PATCH 146/185] Move list of trusted extensions to product.json & enable for Desktop (#165565) Fixes https://github.com/microsoft/vscode-internalbacklog/issues/3161 It's wild to me that we only allowed this on web originally. This should get rid of quite a few dialogs on Desktop. --- src/vs/base/common/product.ts | 1 + .../browser/authenticationService.ts | 25 +++---------------- 2 files changed, 4 insertions(+), 22 deletions(-) diff --git a/src/vs/base/common/product.ts b/src/vs/base/common/product.ts index cf3eabacb71..149c3b94716 100644 --- a/src/vs/base/common/product.ts +++ b/src/vs/base/common/product.ts @@ -90,6 +90,7 @@ export interface IProductConfiguration { readonly webExtensionTips?: readonly string[]; readonly languageExtensionTips?: readonly string[]; readonly trustedExtensionUrlPublicKeys?: { [id: string]: string[] }; + readonly trustedExtensionAuthAccess?: readonly string[]; readonly crashReporter?: { readonly companyName: string; diff --git a/src/vs/workbench/services/authentication/browser/authenticationService.ts b/src/vs/workbench/services/authentication/browser/authenticationService.ts index d5e2b750297..7d6520effe5 100644 --- a/src/vs/workbench/services/authentication/browser/authenticationService.ts +++ b/src/vs/workbench/services/authentication/browser/authenticationService.ts @@ -7,7 +7,6 @@ import { flatten } from 'vs/base/common/arrays'; import { Emitter, Event } from 'vs/base/common/event'; import { IJSONSchema } from 'vs/base/common/jsonSchema'; import { Disposable, dispose, IDisposable, MutableDisposable } from 'vs/base/common/lifecycle'; -import { isWeb } from 'vs/base/common/platform'; import { isFalsyOrWhitespace } from 'vs/base/common/strings'; import { isString } from 'vs/base/common/types'; import * as nls from 'vs/nls'; @@ -26,7 +25,6 @@ import { AuthenticationProviderInformation, AuthenticationSession, Authenticatio import { IBrowserWorkbenchEnvironmentService } from 'vs/workbench/services/environment/browser/environmentService'; import { ActivationKind, IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { ExtensionsRegistry } from 'vs/workbench/services/extensions/common/extensionsRegistry'; -import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; export function getAuthenticationProviderActivationEvent(id: string): string { return `onAuthenticationRequest:${id}`; } @@ -36,16 +34,6 @@ interface IAccountUsage { lastUsed: number; } -const FIRST_PARTY_ALLOWED_EXTENSIONS = [ - 'vscode.git', - 'vscode.github', - 'github.vscode-pull-request-github', - 'github.remotehub', - 'github.remotehub-insiders', - 'github.codespaces', - 'ms-vsliveshare.vsliveshare' -]; - export function readAccountUsages(storageService: IStorageService, providerId: string, accountName: string,): IAccountUsage[] { const accountKey = `${providerId}-${accountName}-usages`; const storedUsages = storageService.get(accountKey, StorageScope.APPLICATION); @@ -204,9 +192,9 @@ export class AuthenticationService extends Disposable implements IAuthentication @IActivityService private readonly activityService: IActivityService, @IExtensionService private readonly extensionService: IExtensionService, @IStorageService private readonly storageService: IStorageService, - @IRemoteAgentService private readonly remoteAgentService: IRemoteAgentService, @IDialogService private readonly dialogService: IDialogService, - @IQuickInputService private readonly quickInputService: IQuickInputService + @IQuickInputService private readonly quickInputService: IQuickInputService, + @IProductService private readonly productService: IProductService, ) { super(); @@ -392,14 +380,7 @@ export class AuthenticationService extends Disposable implements IAuthentication : true; } - const remoteConnection = this.remoteAgentService.getConnection(); - // Right now, this is hardcoded to only happen in Codespaces and on web. - // TODO: this should be determined by the embedder so that this logic isn't in core. - const allowedAllowedExtensions = remoteConnection !== null - ? remoteConnection.remoteAuthority.startsWith('codespaces') - : isWeb; - - if (allowedAllowedExtensions && FIRST_PARTY_ALLOWED_EXTENSIONS.includes(extensionId)) { + if (this.productService.trustedExtensionAuthAccess?.includes(extensionId)) { return true; } From 7f3a7edf0f9e91f30e4650b7a4c24f2a9b1d253c Mon Sep 17 00:00:00 2001 From: Raymond Zhao <7199958+rzhao271@users.noreply.github.com> Date: Fri, 4 Nov 2022 17:42:01 -0700 Subject: [PATCH 147/185] Localize emmet using l10n.t (#165568) Ref #164438 --- extensions/emmet/src/abbreviationActions.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/extensions/emmet/src/abbreviationActions.ts b/extensions/emmet/src/abbreviationActions.ts index 45a9510acd5..d38adff72e1 100644 --- a/extensions/emmet/src/abbreviationActions.ts +++ b/extensions/emmet/src/abbreviationActions.ts @@ -4,12 +4,10 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; -import * as nls from 'vscode-nls'; import { Node, HtmlNode, Rule, Property, Stylesheet } from 'EmmetFlatNode'; import { getEmmetHelper, getFlatNode, getHtmlFlatNode, getMappingForIncludedLanguages, validate, getEmmetConfiguration, isStyleSheet, getEmmetMode, parsePartialStylesheet, isStyleAttribute, getEmbeddedCssNodeIfAny, allowedMimeTypesInScriptTag, toLSTextDocument, isOffsetInsideOpenOrCloseTag } from './util'; import { getRootNode as parseDocument } from './parseDocument'; -const localize = nls.loadMessageBundle(); const trimRegex = /[\u00a0]*[\d#\-\*\u2022]+\.?/; const hexColorRegex = /^#[\da-fA-F]{0,6}$/; @@ -250,7 +248,7 @@ export async function wrapWithAbbreviation(args: any): Promise { return ''; } - const prompt = localize('wrapWithAbbreviationPrompt', "Enter Abbreviation"); + const prompt = vscode.l10n.t("Enter Abbreviation"); const inputAbbreviation = (args && args['abbreviation']) ? (args['abbreviation'] as string) : await vscode.window.showInputBox({ prompt, validateInput: inputChanged }); From 05ec31617136e13a0902f34eb6634546d1c66ef8 Mon Sep 17 00:00:00 2001 From: Megan Rogge Date: Fri, 4 Nov 2022 17:44:53 -0700 Subject: [PATCH 148/185] run auto tasks if trusted & on (#165570) --- .../tasks/browser/runAutomaticTasks.ts | 76 +++---------------- .../tasks/browser/task.contribution.ts | 7 +- 2 files changed, 14 insertions(+), 69 deletions(-) diff --git a/src/vs/workbench/contrib/tasks/browser/runAutomaticTasks.ts b/src/vs/workbench/contrib/tasks/browser/runAutomaticTasks.ts index f022fbcede2..0aaa08a838d 100644 --- a/src/vs/workbench/contrib/tasks/browser/runAutomaticTasks.ts +++ b/src/vs/workbench/contrib/tasks/browser/runAutomaticTasks.ts @@ -9,19 +9,15 @@ import { Disposable } from 'vs/base/common/lifecycle'; import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; import { ITaskService, IWorkspaceFolderTaskResult } from 'vs/workbench/contrib/tasks/common/taskService'; import { RunOnOptions, Task, TaskRunSource, TaskSource, TaskSourceKind, TASKS_CATEGORY, WorkspaceFileTaskSource, IWorkspaceTaskSource } from 'vs/workbench/contrib/tasks/common/tasks'; -import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; -import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; import { IQuickPickItem, IQuickInputService } from 'vs/platform/quickinput/common/quickInput'; import { Action2 } from 'vs/platform/actions/common/actions'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { IWorkspaceTrustManagementService } from 'vs/platform/workspace/common/workspaceTrust'; import { ConfigurationTarget, IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { IOpenerService } from 'vs/platform/opener/common/opener'; import { URI } from 'vs/base/common/uri'; import { Event } from 'vs/base/common/event'; import { ILogService } from 'vs/platform/log/common/log'; -const HAS_PROMPTED_FOR_AUTOMATIC_TASKS = 'task.hasPromptedForAutomaticTasks'; const ALLOW_AUTOMATIC_TASKS = 'task.allowAutomaticTasks'; export class RunAutomaticTasks extends Disposable implements IWorkbenchContribution { @@ -30,10 +26,7 @@ export class RunAutomaticTasks extends Disposable implements IWorkbenchContribut @ITaskService private readonly _taskService: ITaskService, @IConfigurationService private readonly _configurationService: IConfigurationService, @IWorkspaceTrustManagementService private readonly _workspaceTrustManagementService: IWorkspaceTrustManagementService, - @ILogService private readonly _logService: ILogService, - @IStorageService private readonly _storageService: IStorageService, - @IOpenerService private readonly _openerService: IOpenerService, - @INotificationService private readonly _notificationService: INotificationService) { + @ILogService private readonly _logService: ILogService) { super(); if (this._workspaceTrustManagementService.isWorkspaceTrusted()) { this._tryRunTasks(); @@ -58,7 +51,7 @@ export class RunAutomaticTasks extends Disposable implements IWorkbenchContribut } const workspaceTasks = await this._taskService.getWorkspaceTasks(TaskRunSource.FolderOpen); this._logService.trace(`RunAutomaticTasks: Found ${workspaceTasks.size} automatic tasks`); - await this._runWithPermission(this._taskService, this._storageService, this._notificationService, this._workspaceTrustManagementService, this._openerService, this._configurationService, workspaceTasks); + await this._runWithPermission(this._taskService, this._configurationService, workspaceTasks); } private _runTasks(taskService: ITaskService, tasks: Array>) { @@ -130,71 +123,24 @@ export class RunAutomaticTasks extends Disposable implements IWorkbenchContribut return { tasks, taskNames, locations }; } - private async _runWithPermission(taskService: ITaskService, storageService: IStorageService, notificationService: INotificationService, workspaceTrustManagementService: IWorkspaceTrustManagementService, - openerService: IOpenerService, configurationService: IConfigurationService, workspaceTaskResult: Map) { + private async _runWithPermission(taskService: ITaskService, configurationService: IConfigurationService, workspaceTaskResult: Map) { - const hasShownPromptForAutomaticTasks = storageService.getBoolean(HAS_PROMPTED_FOR_AUTOMATIC_TASKS, StorageScope.WORKSPACE, false); - const { tasks, taskNames, locations } = this._findAutoTasks(taskService, workspaceTaskResult); + const { tasks, taskNames } = this._findAutoTasks(taskService, workspaceTaskResult); if (taskNames.length === 0) { return; } - if (configurationService.getValue(ALLOW_AUTOMATIC_TASKS) === 'on') { - this._runTasks(taskService, tasks); - } else if (configurationService.getValue(ALLOW_AUTOMATIC_TASKS) === 'auto' && !hasShownPromptForAutomaticTasks) { - // by default, only prompt once per folder - // otherwise, this can be configured via the setting - this._showPrompt(notificationService, storageService, openerService, configurationService, taskNames, locations).then(allow => { - if (allow) { - storageService.store(HAS_PROMPTED_FOR_AUTOMATIC_TASKS, true, StorageScope.WORKSPACE, StorageTarget.USER); - this._runTasks(taskService, tasks); - } - }); + if (configurationService.getValue(ALLOW_AUTOMATIC_TASKS) === 'off') { + return; } - } - - private _showPrompt(notificationService: INotificationService, storageService: IStorageService, - openerService: IOpenerService, configurationService: IConfigurationService, taskNames: Array, locations: Map): Promise { - return new Promise(resolve => { - notificationService.prompt(Severity.Info, nls.localize('tasks.run.allowAutomatic', - "This workspace has tasks ({0}) defined ({1}) that run automatically when you open this workspace. Do you allow automatic tasks to run when you open this workspace?", - taskNames.join(', '), - Array.from(locations.keys()).join(', ') - ), - [{ - label: nls.localize('allow', "Allow and run"), - run: () => { - resolve(true); - configurationService.updateValue(ALLOW_AUTOMATIC_TASKS, 'on', ConfigurationTarget.WORKSPACE); - } - }, - { - label: nls.localize('disallow', "Disallow"), - run: () => { - resolve(false); - configurationService.updateValue(ALLOW_AUTOMATIC_TASKS, 'off', ConfigurationTarget.WORKSPACE); - - } - }, - { - label: locations.size === 1 ? nls.localize('openTask', "Open file") : nls.localize('openTasks', "Open files"), - run: async () => { - for (const location of locations) { - await openerService.open(location[1]); - } - resolve(false); - } - }] - ); - storageService.store(HAS_PROMPTED_FOR_AUTOMATIC_TASKS, true, StorageScope.WORKSPACE, StorageTarget.MACHINE); - }); + this._runTasks(taskService, tasks); } } export class ManageAutomaticTaskRunning extends Action2 { public static readonly ID = 'workbench.action.tasks.manageAutomaticRunning'; - public static readonly LABEL = nls.localize('workbench.action.tasks.manageAutomaticRunning', "Manage Automatic Tasks in Folder"); + public static readonly LABEL = nls.localize('workbench.action.tasks.manageAutomaticRunning', "Manage Automatic Tasks"); constructor() { super({ @@ -207,12 +153,12 @@ export class ManageAutomaticTaskRunning extends Action2 { public async run(accessor: ServicesAccessor): Promise { const quickInputService = accessor.get(IQuickInputService); const configurationService = accessor.get(IConfigurationService); - const allowItem: IQuickPickItem = { label: nls.localize('workbench.action.tasks.allowAutomaticTasks', "Allow Automatic Tasks in Folder") }; - const disallowItem: IQuickPickItem = { label: nls.localize('workbench.action.tasks.disallowAutomaticTasks', "Disallow Automatic Tasks in Folder") }; + const allowItem: IQuickPickItem = { label: nls.localize('workbench.action.tasks.allowAutomaticTasks', "Allow Automatic Tasks") }; + const disallowItem: IQuickPickItem = { label: nls.localize('workbench.action.tasks.disallowAutomaticTasks', "Disallow Automatic Tasks") }; const value = await quickInputService.pick([allowItem, disallowItem], { canPickMany: false }); if (!value) { return; } - configurationService.updateValue(ALLOW_AUTOMATIC_TASKS, value === allowItem ? 'on' : 'off', ConfigurationTarget.WORKSPACE); + configurationService.updateValue(ALLOW_AUTOMATIC_TASKS, value === allowItem ? 'on' : 'off', ConfigurationTarget.USER); } } diff --git a/src/vs/workbench/contrib/tasks/browser/task.contribution.ts b/src/vs/workbench/contrib/tasks/browser/task.contribution.ts index a8b5100b47b..13662e26c6a 100644 --- a/src/vs/workbench/contrib/tasks/browser/task.contribution.ts +++ b/src/vs/workbench/contrib/tasks/browser/task.contribution.ts @@ -496,14 +496,13 @@ configurationRegistry.registerConfiguration({ }, [TaskSettingId.AllowAutomaticTasks]: { type: 'string', - enum: ['on', 'auto', 'off'], + enum: ['on', 'off'], enumDescriptions: [ nls.localize('task.allowAutomaticTasks.on', "Always"), - nls.localize('task.allowAutomaticTasks.auto', "Prompt for permission for each folder"), nls.localize('task.allowAutomaticTasks.off', "Never"), ], - description: nls.localize('task.allowAutomaticTasks', "Enable automatic tasks in the folder - note that tasks won't run in an untrusted workspace."), - default: 'auto', + description: nls.localize('task.allowAutomaticTasks', "Enable automatic tasks - note that tasks won't run in an untrusted workspace."), + default: 'on', restricted: true }, [TaskSettingId.ShowDecorations]: { From 7acbd9df695534f5487910939b8b158c6d40c3c7 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Fri, 4 Nov 2022 23:15:06 -0700 Subject: [PATCH 149/185] Try passing offset to editors on layout (#164287) * Try passing offset to editors on layout When a notebook editor is created, it currently has to force a relayout to determine where the overlay webview should be positioned. We do this with a call to `getBoundingClientRect` However the grid view should already have information about where the editor is positioned. If we can use this, then we can skip the expensive call to `getBoundingClientRect` entirely This change attempts to pass the `top` and `left` offsets to the `EditorGroupView` and eventually down into `NotebookEditorWidget` The PR does not work properly however as the offset that the `EditorGroupView` gets is wrong. I've added some todo comments about where this seems to be happening * Remove todo and update layout over --- src/vs/base/browser/dom.ts | 7 ++- src/vs/workbench/browser/composite.ts | 4 +- .../browser/parts/editor/editorGroupView.ts | 18 +++---- .../browser/parts/editor/editorPanes.ts | 14 +++--- .../notebook/browser/notebookEditor.ts | 14 +++--- .../notebook/browser/notebookEditorWidget.ts | 48 +++++++++++++------ 6 files changed, 64 insertions(+), 41 deletions(-) diff --git a/src/vs/base/browser/dom.ts b/src/vs/base/browser/dom.ts index b756f7b5bf4..1abef9c8d49 100644 --- a/src/vs/base/browser/dom.ts +++ b/src/vs/base/browser/dom.ts @@ -417,7 +417,12 @@ export class Dimension implements IDimension { } } -export function getTopLeftOffset(element: HTMLElement): { left: number; top: number } { +export interface IDomPosition { + readonly left: number; + readonly top: number; +} + +export function getTopLeftOffset(element: HTMLElement): IDomPosition { // Adapted from WinJS.Utilities.getPosition // and added borders to the mix diff --git a/src/vs/workbench/browser/composite.ts b/src/vs/workbench/browser/composite.ts index ca2f9cdf638..da300e9934e 100644 --- a/src/vs/workbench/browser/composite.ts +++ b/src/vs/workbench/browser/composite.ts @@ -10,7 +10,7 @@ import { IComposite, ICompositeControl } from 'vs/workbench/common/composite'; import { Event, Emitter } from 'vs/base/common/event'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { IConstructorSignature, IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { trackFocus, Dimension } from 'vs/base/browser/dom'; +import { trackFocus, Dimension, IDomPosition } from 'vs/base/browser/dom'; import { IStorageService } from 'vs/platform/storage/common/storage'; import { Disposable } from 'vs/base/common/lifecycle'; import { assertIsDefined } from 'vs/base/common/types'; @@ -153,7 +153,7 @@ export abstract class Composite extends Component implements IComposite { /** * Layout the contents of this composite using the provided dimensions. */ - abstract layout(dimension: Dimension): void; + abstract layout(dimension: Dimension, position?: IDomPosition): void; /** * Update the styles of the contents of this composite. diff --git a/src/vs/workbench/browser/parts/editor/editorGroupView.ts b/src/vs/workbench/browser/parts/editor/editorGroupView.ts index 55a84735955..de6a2d9c5c6 100644 --- a/src/vs/workbench/browser/parts/editor/editorGroupView.ts +++ b/src/vs/workbench/browser/parts/editor/editorGroupView.ts @@ -11,7 +11,7 @@ import { EditorInput } from 'vs/workbench/common/editor/editorInput'; import { SideBySideEditorInput } from 'vs/workbench/common/editor/sideBySideEditorInput'; import { Emitter, Relay } from 'vs/base/common/event'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { Dimension, trackFocus, addDisposableListener, EventType, EventHelper, findParentWithClass, clearNode, isAncestor, asCSSUrl } from 'vs/base/browser/dom'; +import { Dimension, trackFocus, addDisposableListener, EventType, EventHelper, findParentWithClass, clearNode, isAncestor, asCSSUrl, IDomNodePagePosition } from 'vs/base/browser/dom'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { ProgressBar } from 'vs/base/browser/ui/progressbar/progressbar'; @@ -111,7 +111,7 @@ export class EditorGroupView extends Themable implements IEditorGroupView { private readonly model: EditorGroupModel; private active: boolean | undefined; - private dimension: Dimension | undefined; + private lastLayout: IDomNodePagePosition | undefined; private readonly scopedInstantiationService: IInstantiationService; @@ -1891,25 +1891,25 @@ export class EditorGroupView extends Themable implements IEditorGroupView { private _onDidChange = this._register(new Relay<{ width: number; height: number } | undefined>()); readonly onDidChange = this._onDidChange.event; - layout(width: number, height: number): void { - this.dimension = new Dimension(width, height); + layout(width: number, height: number, top: number, left: number): void { + this.lastLayout = { width, height, top, left }; // Layout the title area first to receive the size it occupies const titleAreaSize = this.titleAreaControl.layout({ - container: this.dimension, + container: new Dimension(width, height), available: new Dimension(width, height - this.editorPane.minimumHeight) }); // Pass the container width and remaining height to the editor layout const editorHeight = Math.max(0, height - titleAreaSize.height); this.editorContainer.style.height = `${editorHeight}px`; - this.editorPane.layout(new Dimension(width, editorHeight)); + this.editorPane.layout({ width, height: editorHeight, top: top + titleAreaSize.height, left }); } relayout(): void { - if (this.dimension) { - const { width, height } = this.dimension; - this.layout(width, height); + if (this.lastLayout) { + const { width, height, top, left } = this.lastLayout; + this.layout(width, height, top, left); } } diff --git a/src/vs/workbench/browser/parts/editor/editorPanes.ts b/src/vs/workbench/browser/parts/editor/editorPanes.ts index 268c214a232..91a7116b1d8 100644 --- a/src/vs/workbench/browser/parts/editor/editorPanes.ts +++ b/src/vs/workbench/browser/parts/editor/editorPanes.ts @@ -10,7 +10,7 @@ import Severity from 'vs/base/common/severity'; import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; import { EditorExtensions, EditorInputCapabilities, IEditorOpenContext, IVisibleEditorPane } from 'vs/workbench/common/editor'; import { EditorInput } from 'vs/workbench/common/editor/editorInput'; -import { Dimension, show, hide } from 'vs/base/browser/dom'; +import { Dimension, show, hide, IDomNodePagePosition } from 'vs/base/browser/dom'; import { Registry } from 'vs/platform/registry/common/platform'; import { IEditorPaneRegistry, IEditorPaneDescriptor } from 'vs/workbench/browser/editor'; import { IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/layoutService'; @@ -84,7 +84,7 @@ export class EditorPanes extends Disposable { private readonly editorPanes: EditorPane[] = []; private readonly activeEditorPaneDisposables = this._register(new DisposableStore()); - private dimension: Dimension | undefined; + private pagePosition: IDomNodePagePosition | undefined; private readonly editorOperation = this._register(new LongRunningOperation(this.editorProgressService)); private readonly editorPanesRegistry = Registry.as(EditorExtensions.EditorPane); @@ -269,8 +269,8 @@ export class EditorPanes extends Disposable { editorPane.setVisible(true, this.groupView); // Layout - if (this.dimension) { - editorPane.layout(this.dimension); + if (this.pagePosition) { + editorPane.layout(new Dimension(this.pagePosition.width, this.pagePosition.height), { top: this.pagePosition.top, left: this.pagePosition.left }); } return editorPane; @@ -397,9 +397,9 @@ export class EditorPanes extends Disposable { this._activeEditorPane?.setVisible(visible, this.groupView); } - layout(dimension: Dimension): void { - this.dimension = dimension; + layout(pagePosition: IDomNodePagePosition): void { + this.pagePosition = pagePosition; - this._activeEditorPane?.layout(dimension); + this._activeEditorPane?.layout(new Dimension(pagePosition.width, pagePosition.height), pagePosition); } } diff --git a/src/vs/workbench/contrib/notebook/browser/notebookEditor.ts b/src/vs/workbench/contrib/notebook/browser/notebookEditor.ts index ebf0e908fa4..90ea4504d46 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebookEditor.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebookEditor.ts @@ -48,7 +48,7 @@ export class NotebookEditor extends EditorPane implements IEditorPaneWithSelecti private readonly _widgetDisposableStore: DisposableStore = this._register(new DisposableStore()); private _widget: IBorrowValue = { value: undefined }; private _rootElement!: HTMLElement; - private _dimension?: DOM.Dimension; + private _pagePosition?: { readonly dimension: DOM.Dimension; readonly position: DOM.IDomPosition }; private readonly _inputListener = this._register(new MutableDisposable()); @@ -180,7 +180,7 @@ export class NotebookEditor extends EditorPane implements IEditorPaneWithSelecti // we need to hide it before getting a new widget this._widget.value?.onWillHide(); - this._widget = >this._instantiationService.invokeFunction(this._notebookWidgetService.retrieveWidget, group, input, undefined, this._dimension); + this._widget = >this._instantiationService.invokeFunction(this._notebookWidgetService.retrieveWidget, group, input, undefined, this._pagePosition?.dimension); if (this._rootElement && this._widget.value!.getDomNode()) { this._rootElement.setAttribute('aria-flowto', this._widget.value!.getDomNode().id || ''); @@ -190,8 +190,8 @@ export class NotebookEditor extends EditorPane implements IEditorPaneWithSelecti this._widgetDisposableStore.add(this._widget.value!.onDidChangeModel(() => this._onDidChangeModel.fire())); this._widgetDisposableStore.add(this._widget.value!.onDidChangeActiveCell(() => this._onDidChangeSelection.fire({ reason: EditorPaneSelectionChangeReason.USER }))); - if (this._dimension) { - this._widget.value!.layout(this._dimension, this._rootElement); + if (this._pagePosition) { + this._widget.value!.layout(this._pagePosition.dimension, this._rootElement, this._pagePosition.position); } // only now `setInput` and yield/await. this is AFTER the actual widget is ready. This is very important @@ -395,10 +395,10 @@ export class NotebookEditor extends EditorPane implements IEditorPaneWithSelecti return; } - layout(dimension: DOM.Dimension): void { + layout(dimension: DOM.Dimension, position: DOM.IDomPosition): void { this._rootElement.classList.toggle('mid-width', dimension.width < 1000 && dimension.width >= 600); this._rootElement.classList.toggle('narrow-width', dimension.width < 600); - this._dimension = dimension; + this._pagePosition = { dimension, position }; if (!this._widget.value || !(this._input instanceof NotebookEditorInput)) { return; @@ -414,7 +414,7 @@ export class NotebookEditor extends EditorPane implements IEditorPaneWithSelecti return; } - this._widget.value.layout(this._dimension, this._rootElement); + this._widget.value.layout(dimension, this._rootElement, position); } //#endregion diff --git a/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts b/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts index 95f0232295a..f54262aa0b9 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts @@ -83,6 +83,7 @@ import { NotebookPerfMarks } from 'vs/workbench/contrib/notebook/common/notebook import { BaseCellEditorOptions } from 'vs/workbench/contrib/notebook/browser/viewModel/cellEditorOptions'; import { ILogService } from 'vs/platform/log/common/log'; import { FloatingClickMenu } from 'vs/workbench/browser/codeeditor'; +import { IDimension } from 'vs/editor/common/core/dimension'; const $ = DOM.$; @@ -323,12 +324,12 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditorD } })); - this._register(editorGroupsService.onDidScroll(() => { + this._register(editorGroupsService.onDidScroll(e => { if (!this._shadowElement || !this._isVisible) { return; } - this.updateShadowElement(this._shadowElement); + this.updateShadowElement(this._shadowElement, this._dimension); this.layoutContainerOverShadowElement(this._dimension); })); @@ -1691,7 +1692,7 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditorD return this._scrollBeyondLastLine && !this.isEmbedded; } - layout(dimension: DOM.Dimension, shadowElement?: HTMLElement): void { + layout(dimension: DOM.Dimension, shadowElement?: HTMLElement, position?: DOM.IDomPosition): void { if (!shadowElement && this._shadowElementViewInfo === null) { this._dimension = dimension; return; @@ -1703,7 +1704,7 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditorD } if (shadowElement) { - this.updateShadowElement(shadowElement); + this.updateShadowElement(shadowElement, dimension, position); } if (this._shadowElementViewInfo && this._shadowElementViewInfo.width <= 0 && this._shadowElementViewInfo.height <= 0) { @@ -1732,7 +1733,7 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditorD this._overlayContainer.style.position = 'absolute'; this._overlayContainer.style.overflow = 'hidden'; - this.layoutContainerOverShadowElement(dimension); + this.layoutContainerOverShadowElement(dimension, position); if (this._webviewTransparentCover) { this._webviewTransparentCover.style.height = `${dimension.height}px`; @@ -1745,19 +1746,36 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditorD this._viewContext?.eventDispatcher.emit([new NotebookLayoutChangedEvent({ width: true, fontInfo: true }, this.getLayoutInfo())]); } - private updateShadowElement(shadowElement: HTMLElement) { - const containerRect = shadowElement.getBoundingClientRect(); - + private updateShadowElement(shadowElement: HTMLElement, dimension?: IDimension, position?: DOM.IDomPosition) { this._shadowElement = shadowElement; - this._shadowElementViewInfo = { - height: containerRect.height, - width: containerRect.width, - top: containerRect.top, - left: containerRect.left - }; + if (dimension && position) { + this._shadowElementViewInfo = { + height: dimension.height, + width: dimension.width, + top: position.top, + left: position.left, + }; + } else { + // We have to recompute position and size ourselves (which is slow) + const containerRect = shadowElement.getBoundingClientRect(); + this._shadowElementViewInfo = { + height: containerRect.height, + width: containerRect.width, + top: containerRect.top, + left: containerRect.left + }; + } } - private layoutContainerOverShadowElement(dimension?: DOM.Dimension | null): void { + private layoutContainerOverShadowElement(dimension?: DOM.Dimension, position?: DOM.IDomPosition): void { + if (dimension && position) { + this._overlayContainer.style.top = `${position.top}px`; + this._overlayContainer.style.left = `${position.left}px`; + this._overlayContainer.style.width = `${dimension.width}px`; + this._overlayContainer.style.height = `${dimension.height}px`; + return; + } + if (!this._shadowElementViewInfo) { return; } From 08baa8abb444c9befcde2e4a3b275f2da457a140 Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Sat, 5 Nov 2022 07:15:42 +0100 Subject: [PATCH 150/185] Git - Only use `this.dotGit` when resolving HEAD (#165497) Fix #164363 --- extensions/git/src/git.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/git/src/git.ts b/extensions/git/src/git.ts index 368180965ac..86ff30ec8f9 100644 --- a/extensions/git/src/git.ts +++ b/extensions/git/src/git.ts @@ -2067,7 +2067,7 @@ export class Repository { } async getHEADFS(): Promise { - const raw = await fs.readFile(path.join(this.dotGit.commonPath ?? this.dotGit.path, 'HEAD'), 'utf8'); + const raw = await fs.readFile(path.join(this.dotGit.path, 'HEAD'), 'utf8'); // Branch const branchMatch = raw.match(/^ref: refs\/heads\/(?.*)$/m); From 0c121703bbbb5cd80f99ea2bf709e0419ccf21d5 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Sun, 6 Nov 2022 10:04:55 -0800 Subject: [PATCH 151/185] Add readonly to a few more properties (#165563) Add readonly to a few properties --- src/vs/base/browser/ui/actionbar/actionbar.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/vs/base/browser/ui/actionbar/actionbar.ts b/src/vs/base/browser/ui/actionbar/actionbar.ts index f816e7795c7..0b2da4a1e85 100644 --- a/src/vs/base/browser/ui/actionbar/actionbar.ts +++ b/src/vs/base/browser/ui/actionbar/actionbar.ts @@ -84,19 +84,19 @@ export class ActionBar extends Disposable implements IActionRunner { // Elements domNode: HTMLElement; - protected actionsList: HTMLElement; + protected readonly actionsList: HTMLElement; - private _onDidBlur = this._register(new Emitter()); + private readonly _onDidBlur = this._register(new Emitter()); readonly onDidBlur = this._onDidBlur.event; - private _onDidCancel = this._register(new Emitter({ onWillAddFirstListener: () => this.cancelHasListener = true })); + private readonly _onDidCancel = this._register(new Emitter({ onWillAddFirstListener: () => this.cancelHasListener = true })); readonly onDidCancel = this._onDidCancel.event; private cancelHasListener = false; - private _onDidRun = this._register(new Emitter()); + private readonly _onDidRun = this._register(new Emitter()); readonly onDidRun = this._onDidRun.event; - private _onWillRun = this._register(new Emitter()); + private readonly _onWillRun = this._register(new Emitter()); readonly onWillRun = this._onWillRun.event; constructor(container: HTMLElement, options: IActionBarOptions = {}) { From f9fb40f63310323cd80e2a06fca36d9df2db9e57 Mon Sep 17 00:00:00 2001 From: rebornix Date: Sun, 6 Nov 2022 21:12:36 -0800 Subject: [PATCH 152/185] Separate content and overlay. --- .../docs/viewport-rendering.drawio.svg | 294 +++++++++--------- .../notebook/browser/notebookEditorWidget.ts | 9 +- .../contrib/notebook/browser/view/cellPart.ts | 137 +++++++- .../browser/view/cellParts/cellComments.ts | 4 +- .../browser/view/cellParts/cellContextKeys.ts | 4 +- .../browser/view/cellParts/cellDecorations.ts | 4 +- .../browser/view/cellParts/cellDnd.ts | 4 +- .../view/cellParts/cellEditorOptions.ts | 4 +- .../browser/view/cellParts/cellExecution.ts | 4 +- .../browser/view/cellParts/cellFocus.ts | 4 +- .../view/cellParts/cellFocusIndicator.ts | 4 +- .../browser/view/cellParts/cellOutput.ts | 4 +- .../browser/view/cellParts/cellProgressBar.ts | 4 +- .../browser/view/cellParts/cellStatusPart.ts | 4 +- .../browser/view/cellParts/cellToolbars.ts | 148 ++++++--- .../browser/view/cellParts/codeCell.ts | 18 +- .../view/cellParts/codeCellRunToolbar.ts | 4 +- .../view/cellParts/collapsedCellInput.ts | 4 +- .../view/cellParts/collapsedCellOutput.ts | 4 +- .../browser/view/cellParts/foldedCellHint.ts | 4 +- .../browser/view/cellParts/markupCell.ts | 2 +- .../browser/view/renderers/cellRenderer.ts | 10 +- 22 files changed, 430 insertions(+), 248 deletions(-) diff --git a/src/vs/workbench/contrib/notebook/browser/docs/viewport-rendering.drawio.svg b/src/vs/workbench/contrib/notebook/browser/docs/viewport-rendering.drawio.svg index c10662c48d3..6a51b66c723 100644 --- a/src/vs/workbench/contrib/notebook/browser/docs/viewport-rendering.drawio.svg +++ b/src/vs/workbench/contrib/notebook/browser/docs/viewport-rendering.drawio.svg @@ -1,22 +1,22 @@ - + - - - + + + - +
-
-
+
+
Render Viewport
- + Render Viewport @@ -24,100 +24,100 @@ - +
-
-
+
+
Notebook List View
- + Notebook List View - - - - - + + + + + - +
-
-
+
+
Render Template
- + Render Template - - - - - + + + + + - +
-
-
+
+
Render Element
- + Render Element - + - +
-
-
+
+
Get Dynamic Height
- + Get Dynamic Height - - - - - - + + + + + + - +
-
-
+
+
Create Cell Templates/Parts
- + Create Cell Templates/Parts @@ -125,10 +125,10 @@ - +
-
-
+
+
Toolbar
@@ -142,10 +142,10 @@ - +
-
-
+
+
Editor
@@ -159,10 +159,10 @@ - +
-
-
+
+
Statusbar
@@ -173,64 +173,64 @@ - - - + + + - +
-
-
+
+
Code Cell
- + Code Cell - + - +
-
-
+
+
Render Cell Parts
- + Render Cell Parts - - - - - - - + + + + + + + - +
-
-
+
+
CellPart read DOM
- + CellPart read DOM @@ -238,81 +238,81 @@ - +
-
-
+
+
Update layout info
- + Update layout info - - - - + + + + - -
-
-
+ +
+
+
Toolbar.renderCell
- + Toolbar.renderCell - + - -
-
-
+ +
+
+
Toolbar.renderCell
- + Toolbar.renderCell - + - -
-
-
- Toolbar.renderCell + +
+
+
+ Toolbar.didRenderCell
- - Toolbar.renderCell + + Toolbar.didRenderCell - +
-
-
+
+
Toolbar.renderCell
@@ -326,10 +326,10 @@ - +
-
-
+
+
Toolbar.renderCell
@@ -343,10 +343,10 @@ - +
-
-
+
+
Toolbar.prepareLayout @@ -359,44 +359,44 @@ - - - - - - - + + + + + + + - +
-
-
+
+
Cell Layout Change
- + Cell Layout Change - + - +
-
-
+
+
Cell Part updateInternalLayoutNow
- + Cell Part updateInternalLayoutNow @@ -404,10 +404,10 @@ - +
-
-
+
+
Toolbar.renderCell
@@ -421,10 +421,10 @@ - +
-
-
+
+
Toolbar.renderCell
@@ -438,10 +438,10 @@ - +
-
-
+
+
Toolbar.updateInternalLayoutNow @@ -457,10 +457,10 @@ - +
-
-
+
+
Next Frame
@@ -474,10 +474,10 @@ - +
-
-
+
+
DOM Read @@ -493,10 +493,10 @@ - +
-
-
+
+
DOM Write diff --git a/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts b/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts index f54262aa0b9..feacb3e2174 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts @@ -89,7 +89,14 @@ const $ = DOM.$; export function getDefaultNotebookCreationOptions(): INotebookEditorCreationOptions { // We inlined the id to avoid loading comment contrib in tests - const skipContributions = ['editor.contrib.review', FloatingClickMenu.ID]; + const skipContributions = [ + 'editor.contrib.review', + FloatingClickMenu.ID, + 'editor.contrib.dirtydiff', + 'editor.contrib.testingOutputPeek', + 'editor.contrib.testingDecorations', + 'store.contrib.stickyScrollController' + ]; const contributions = EditorExtensionsRegistry.getEditorContributions().filter(c => skipContributions.indexOf(c.id) === -1); return { diff --git a/src/vs/workbench/contrib/notebook/browser/view/cellPart.ts b/src/vs/workbench/contrib/notebook/browser/view/cellPart.ts index c61b9864c17..71e583dd9d8 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/cellPart.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/cellPart.ts @@ -3,12 +3,13 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; +import * as DOM from 'vs/base/browser/dom'; +import { Disposable, DisposableStore, IDisposable } from 'vs/base/common/lifecycle'; import { ICellViewModel } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { CellViewModelStateChangeEvent } from 'vs/workbench/contrib/notebook/browser/notebookViewEvents'; import { ICellExecutionStateChangedEvent } from 'vs/workbench/contrib/notebook/common/notebookExecutionStateService'; -export abstract class CellPart extends Disposable { +export abstract class CellContentPart extends Disposable { protected currentCell: ICellViewModel | undefined; protected cellDisposables = new DisposableStore(); @@ -16,6 +17,12 @@ export abstract class CellPart extends Disposable { super(); } + /** + * Prepare model for cell part rendering + * No DOM operations recommended within this operation + */ + prepareRenderCell(element: ICellViewModel): void { } + /** * Update the DOM for the cell `element` */ @@ -57,49 +64,149 @@ export abstract class CellPart extends Disposable { updateForExecutionState(element: ICellViewModel, e: ICellExecutionStateChangedEvent): void { } } -export class CellPartsCollection { +export abstract class CellOverlayPart extends Disposable { + protected currentCell: ICellViewModel | undefined; + protected cellDisposables = new DisposableStore(); - constructor( - private readonly parts: readonly CellPart[], - ) { } - - concat(other: readonly CellPart[]): CellPartsCollection { - return new CellPartsCollection(this.parts.concat(other)); + constructor() { + super(); } + /** + * Prepare model for cell part rendering + * No DOM operations recommended within this operation + */ + prepareRenderCell(element: ICellViewModel): void { } + + /** + * Update the DOM for the cell `element` + */ renderCell(element: ICellViewModel): void { - for (const part of this.parts) { + this.currentCell = element; + this.didRenderCell(element); + } + + protected didRenderCell(element: ICellViewModel): void { } + + /** + * Dispose any disposables generated from `didRenderCell` + */ + unrenderCell(element: ICellViewModel): void { + this.currentCell = undefined; + this.cellDisposables.clear(); + } + + /** + * Update internal DOM (top positions) per cell layout info change + * Note that a cell part doesn't need to call `DOM.scheduleNextFrame`, + * the list view will ensure that layout call is invoked in the right frame + */ + updateInternalLayoutNow(element: ICellViewModel): void { } + + /** + * Update per cell state change + */ + updateState(element: ICellViewModel, e: CellViewModelStateChangeEvent): void { } + + /** + * Update per execution state change. + */ + updateForExecutionState(element: ICellViewModel, e: ICellExecutionStateChangedEvent): void { } +} + +export class CellPartsCollection { + private _scheduledOverlayRendering: IDisposable | undefined; + private _scheduledOverlayUpdateState: IDisposable | undefined; + private _scheduledOverlayUpdateExecutionState: IDisposable | undefined; + + constructor( + private readonly contentParts: readonly CellContentPart[], + private readonly overlayParts: readonly CellOverlayPart[] + ) { } + + concatContentPart(other: readonly CellContentPart[]): CellPartsCollection { + return new CellPartsCollection(this.contentParts.concat(other), this.overlayParts); + } + + concatOverlayPart(other: readonly CellOverlayPart[]): CellPartsCollection { + return new CellPartsCollection(this.contentParts, this.overlayParts.concat(other)); + } + + scheduleRenderCell(element: ICellViewModel): void { + // prepare model + for (const part of this.contentParts) { + part.prepareRenderCell(element); + } + + for (const part of this.overlayParts) { + part.prepareRenderCell(element); + } + + // render content parts + for (const part of this.contentParts) { part.renderCell(element); } + + // schedule overlay parts rendering + this._scheduledOverlayRendering?.dispose(); + + this._scheduledOverlayRendering = DOM.modify(() => { + for (const part of this.overlayParts) { + part.renderCell(element); + } + }); } unrenderCell(element: ICellViewModel): void { - for (const part of this.parts) { + for (const part of this.contentParts) { + part.unrenderCell(element); + } + + this._scheduledOverlayRendering?.dispose(); + this._scheduledOverlayUpdateState?.dispose(); + this._scheduledOverlayUpdateExecutionState?.dispose(); + + for (const part of this.overlayParts) { part.unrenderCell(element); } } updateInternalLayoutNow(viewCell: ICellViewModel) { - for (const part of this.parts) { + for (const part of this.contentParts) { part.updateInternalLayoutNow(viewCell); } } prepareLayout() { - for (const part of this.parts) { + for (const part of this.contentParts) { part.prepareLayout(); } } updateState(viewCell: ICellViewModel, e: CellViewModelStateChangeEvent) { - for (const part of this.parts) { + for (const part of this.contentParts) { part.updateState(viewCell, e); } + + this._scheduledOverlayUpdateState?.dispose(); + + this._scheduledOverlayUpdateState = DOM.modify(() => { + for (const part of this.overlayParts) { + part.updateState(viewCell, e); + } + }); } updateForExecutionState(viewCell: ICellViewModel, e: ICellExecutionStateChangedEvent) { - for (const part of this.parts) { + for (const part of this.contentParts) { part.updateForExecutionState(viewCell, e); } + + this._scheduledOverlayUpdateExecutionState?.dispose(); + this._scheduledOverlayUpdateExecutionState = DOM.modify(() => { + for (const part of this.overlayParts) { + part.updateForExecutionState(viewCell, e); + } + }); } } diff --git a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellComments.ts b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellComments.ts index b4bc5a482a3..b8f33697d19 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellComments.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellComments.ts @@ -14,12 +14,12 @@ import { IThemeService } from 'vs/platform/theme/common/themeService'; import { ICommentService } from 'vs/workbench/contrib/comments/browser/commentService'; import { CommentThreadWidget } from 'vs/workbench/contrib/comments/browser/commentThreadWidget'; import { ICellViewModel, INotebookEditorDelegate } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; -import { CellPart } from 'vs/workbench/contrib/notebook/browser/view/cellPart'; +import { CellContentPart } from 'vs/workbench/contrib/notebook/browser/view/cellPart'; import { CodeCellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/codeCellViewModel'; import { CellKind } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { ICellRange } from 'vs/workbench/contrib/notebook/common/notebookRange'; -export class CellComments extends CellPart { +export class CellComments extends CellContentPart { private _initialized: boolean = false; private _commentThreadWidget: CommentThreadWidget | null = null; private currentElement: CodeCellViewModel | undefined; diff --git a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellContextKeys.ts b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellContextKeys.ts index 364939e3456..7f4c8b9f5b4 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellContextKeys.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellContextKeys.ts @@ -8,14 +8,14 @@ import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/c import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { CellEditState, CellFocusMode, ICellViewModel, INotebookEditorDelegate } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { CellViewModelStateChangeEvent } from 'vs/workbench/contrib/notebook/browser/notebookViewEvents'; -import { CellPart } from 'vs/workbench/contrib/notebook/browser/view/cellPart'; +import { CellContentPart } from 'vs/workbench/contrib/notebook/browser/view/cellPart'; import { CodeCellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/codeCellViewModel'; import { MarkupCellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/markupCellViewModel'; import { NotebookCellExecutionState } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { NotebookCellExecutionStateContext, NOTEBOOK_CELL_EDITABLE, NOTEBOOK_CELL_EDITOR_FOCUSED, NOTEBOOK_CELL_EXECUTING, NOTEBOOK_CELL_EXECUTION_STATE, NOTEBOOK_CELL_FOCUSED, NOTEBOOK_CELL_HAS_OUTPUTS, NOTEBOOK_CELL_INPUT_COLLAPSED, NOTEBOOK_CELL_LINE_NUMBERS, NOTEBOOK_CELL_MARKDOWN_EDIT_MODE, NOTEBOOK_CELL_OUTPUT_COLLAPSED, NOTEBOOK_CELL_RESOURCE, NOTEBOOK_CELL_TYPE } from 'vs/workbench/contrib/notebook/common/notebookContextKeys'; import { INotebookExecutionStateService } from 'vs/workbench/contrib/notebook/common/notebookExecutionStateService'; -export class CellContextKeyPart extends CellPart { +export class CellContextKeyPart extends CellContentPart { private cellContextKeyManager: CellContextKeyManager; constructor( diff --git a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellDecorations.ts b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellDecorations.ts index 7aac88fa2dc..103b2371698 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellDecorations.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellDecorations.ts @@ -5,9 +5,9 @@ import * as DOM from 'vs/base/browser/dom'; import { ICellViewModel } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; -import { CellPart } from 'vs/workbench/contrib/notebook/browser/view/cellPart'; +import { CellContentPart } from 'vs/workbench/contrib/notebook/browser/view/cellPart'; -export class CellDecorations extends CellPart { +export class CellDecorations extends CellContentPart { constructor( readonly rootContainer: HTMLElement, readonly decorationContainer: HTMLElement, diff --git a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellDnd.ts b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellDnd.ts index a5b951d33c9..007ed9dc801 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellDnd.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellDnd.ts @@ -9,7 +9,7 @@ import { Disposable, MutableDisposable } from 'vs/base/common/lifecycle'; import * as platform from 'vs/base/common/platform'; import { expandCellRangesWithHiddenCells, ICellViewModel, INotebookEditorDelegate } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { CellViewModelStateChangeEvent } from 'vs/workbench/contrib/notebook/browser/notebookViewEvents'; -import { CellPart } from 'vs/workbench/contrib/notebook/browser/view/cellPart'; +import { CellContentPart } from 'vs/workbench/contrib/notebook/browser/view/cellPart'; import { BaseCellRenderTemplate, INotebookCellList } from 'vs/workbench/contrib/notebook/browser/view/notebookRenderingCommon'; import { cloneNotebookCellTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookCellTextModel'; import { CellEditType, ICellMoveEdit, SelectionStateType } from 'vs/workbench/contrib/notebook/common/notebookCommon'; @@ -30,7 +30,7 @@ interface CellDragEvent { dragPosRatio: number; } -export class CellDragAndDropPart extends CellPart { +export class CellDragAndDropPart extends CellContentPart { constructor( private readonly container: HTMLElement ) { diff --git a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellEditorOptions.ts b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellEditorOptions.ts index f3751c8dbdf..70f65487c66 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellEditorOptions.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellEditorOptions.ts @@ -17,12 +17,12 @@ import { ActiveEditorContext } from 'vs/workbench/common/contextkeys'; import { INotebookCellToolbarActionContext, INotebookCommandContext, NotebookMultiCellAction, NOTEBOOK_ACTIONS_CATEGORY } from 'vs/workbench/contrib/notebook/browser/controller/coreActions'; import { IBaseCellEditorOptions, ICellViewModel } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { NOTEBOOK_CELL_LINE_NUMBERS, NOTEBOOK_EDITOR_FOCUSED } from 'vs/workbench/contrib/notebook/common/notebookContextKeys'; -import { CellPart } from 'vs/workbench/contrib/notebook/browser/view/cellPart'; +import { CellContentPart } from 'vs/workbench/contrib/notebook/browser/view/cellPart'; import { NotebookCellInternalMetadata, NOTEBOOK_EDITOR_ID } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { NotebookOptions } from 'vs/workbench/contrib/notebook/common/notebookOptions'; import { CellViewModelStateChangeEvent } from 'vs/workbench/contrib/notebook/browser/notebookViewEvents'; -export class CellEditorOptions extends CellPart { +export class CellEditorOptions extends CellContentPart { private _lineNumbers: 'on' | 'off' | 'inherit' = 'inherit'; private readonly _onDidChange = this._register(new Emitter()); readonly onDidChange: Event = this._onDidChange.event; diff --git a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellExecution.ts b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellExecution.ts index bfcb770270e..d71a10c6212 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellExecution.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellExecution.ts @@ -8,13 +8,13 @@ import { disposableTimeout } from 'vs/base/common/async'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { ICellViewModel, INotebookEditorDelegate } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { CellViewModelStateChangeEvent } from 'vs/workbench/contrib/notebook/browser/notebookViewEvents'; -import { CellPart } from 'vs/workbench/contrib/notebook/browser/view/cellPart'; +import { CellContentPart } from 'vs/workbench/contrib/notebook/browser/view/cellPart'; import { NotebookCellInternalMetadata } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { INotebookExecutionStateService } from 'vs/workbench/contrib/notebook/common/notebookExecutionStateService'; const UPDATE_EXECUTION_ORDER_GRACE_PERIOD = 200; -export class CellExecutionPart extends CellPart { +export class CellExecutionPart extends CellContentPart { private kernelDisposables = this._register(new DisposableStore()); constructor( diff --git a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellFocus.ts b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellFocus.ts index 281116d7a00..f7df5d49e59 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellFocus.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellFocus.ts @@ -5,10 +5,10 @@ import * as DOM from 'vs/base/browser/dom'; import { INotebookEditor } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; -import { CellPart } from 'vs/workbench/contrib/notebook/browser/view/cellPart'; +import { CellContentPart } from 'vs/workbench/contrib/notebook/browser/view/cellPart'; import { CodeCellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/codeCellViewModel'; -export class CellFocusPart extends CellPart { +export class CellFocusPart extends CellContentPart { constructor( containerElement: HTMLElement, focusSinkElement: HTMLElement | undefined, diff --git a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellFocusIndicator.ts b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellFocusIndicator.ts index 0b27d730a1d..51b7ba06f55 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellFocusIndicator.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellFocusIndicator.ts @@ -6,13 +6,13 @@ import * as DOM from 'vs/base/browser/dom'; import { FastDomNode } from 'vs/base/browser/fastDomNode'; import { CodeCellLayoutInfo, ICellViewModel, INotebookEditorDelegate } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; -import { CellPart } from 'vs/workbench/contrib/notebook/browser/view/cellPart'; +import { CellContentPart } from 'vs/workbench/contrib/notebook/browser/view/cellPart'; import { CellTitleToolbarPart } from 'vs/workbench/contrib/notebook/browser/view/cellParts/cellToolbars'; import { CodeCellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/codeCellViewModel'; import { MarkupCellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/markupCellViewModel'; import { CellKind } from 'vs/workbench/contrib/notebook/common/notebookCommon'; -export class CellFocusIndicator extends CellPart { +export class CellFocusIndicator extends CellContentPart { public codeFocusIndicator: FastDomNode; public outputFocusIndicator: FastDomNode; diff --git a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellOutput.ts b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellOutput.ts index 69052c4576f..e2b8ea102ab 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellOutput.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellOutput.ts @@ -24,7 +24,7 @@ import { IExtensionsViewPaneContainer, VIEWLET_ID as EXTENSION_VIEWLET_ID } from import { INotebookCellActionContext } from 'vs/workbench/contrib/notebook/browser/controller/coreActions'; import { ICellOutputViewModel, ICellViewModel, IInsetRenderOutput, INotebookEditorDelegate, JUPYTER_EXTENSION_ID, RenderOutputType } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { mimetypeIcon } from 'vs/workbench/contrib/notebook/browser/notebookIcons'; -import { CellPart } from 'vs/workbench/contrib/notebook/browser/view/cellPart'; +import { CellContentPart } from 'vs/workbench/contrib/notebook/browser/view/cellPart'; import { CodeCellRenderTemplate } from 'vs/workbench/contrib/notebook/browser/view/notebookRenderingCommon'; import { CodeCellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/codeCellViewModel'; import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookTextModel'; @@ -427,7 +427,7 @@ class OutputEntryViewHandler { } } -export class CellOutputContainer extends CellPart { +export class CellOutputContainer extends CellContentPart { private _outputEntries: OutputEntryViewHandler[] = []; get renderedOutputEntries() { diff --git a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellProgressBar.ts b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellProgressBar.ts index 655bffaa72f..df45ee5073b 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellProgressBar.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellProgressBar.ts @@ -7,11 +7,11 @@ import { ProgressBar } from 'vs/base/browser/ui/progressbar/progressbar'; import { getProgressBarStyles } from 'vs/platform/theme/browser/defaultStyles'; import { ICellViewModel } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { CellViewModelStateChangeEvent } from 'vs/workbench/contrib/notebook/browser/notebookViewEvents'; -import { CellPart } from 'vs/workbench/contrib/notebook/browser/view/cellPart'; +import { CellContentPart } from 'vs/workbench/contrib/notebook/browser/view/cellPart'; import { NotebookCellExecutionState } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { ICellExecutionStateChangedEvent, INotebookExecutionStateService } from 'vs/workbench/contrib/notebook/common/notebookExecutionStateService'; -export class CellProgressBar extends CellPart { +export class CellProgressBar extends CellContentPart { private readonly _progressBar: ProgressBar; private readonly _collapsedProgressBar: ProgressBar; diff --git a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellStatusPart.ts b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellStatusPart.ts index 2234e5d3a15..9a7879ac1fe 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellStatusPart.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellStatusPart.ts @@ -22,7 +22,7 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IThemeService, ThemeColor } from 'vs/platform/theme/common/themeService'; import { INotebookCellActionContext } from 'vs/workbench/contrib/notebook/browser/controller/coreActions'; import { CellFocusMode, ICellViewModel, INotebookEditorDelegate } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; -import { CellPart } from 'vs/workbench/contrib/notebook/browser/view/cellPart'; +import { CellContentPart } from 'vs/workbench/contrib/notebook/browser/view/cellPart'; import { ClickTargetType, IClickTarget } from 'vs/workbench/contrib/notebook/browser/view/cellParts/cellWidgets'; import { CodeCellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/codeCellViewModel'; import { CellStatusbarAlignment, INotebookCellStatusBarItem } from 'vs/workbench/contrib/notebook/common/notebookCommon'; @@ -30,7 +30,7 @@ import { CellStatusbarAlignment, INotebookCellStatusBarItem } from 'vs/workbench const $ = DOM.$; -export class CellEditorStatusBar extends CellPart { +export class CellEditorStatusBar extends CellContentPart { readonly statusBarContainer: HTMLElement; private readonly leftItemsContainer: HTMLElement; diff --git a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellToolbars.ts b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellToolbars.ts index 2ac050ea828..5e3018eec42 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellToolbars.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellToolbars.ts @@ -19,31 +19,37 @@ import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { INotebookCellActionContext } from 'vs/workbench/contrib/notebook/browser/controller/coreActions'; import { ICellViewModel, INotebookEditorDelegate } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { CodiconActionViewItem } from 'vs/workbench/contrib/notebook/browser/view/cellParts/cellActionView'; -import { CellPart } from 'vs/workbench/contrib/notebook/browser/view/cellPart'; +import { CellOverlayPart } from 'vs/workbench/contrib/notebook/browser/view/cellPart'; import { registerStickyScroll } from 'vs/workbench/contrib/notebook/browser/view/cellParts/stickyScroll'; import { WorkbenchToolBar } from 'vs/platform/actions/browser/toolbar'; -export class BetweenCellToolbar extends CellPart { - private _betweenCellToolbar!: ToolBar; +export class BetweenCellToolbar extends CellOverlayPart { + private _betweenCellToolbar: ToolBar | undefined; constructor( private readonly _notebookEditor: INotebookEditorDelegate, _titleToolbarContainer: HTMLElement, private readonly _bottomCellToolbarContainer: HTMLElement, - @IInstantiationService instantiationService: IInstantiationService, - @IContextMenuService contextMenuService: IContextMenuService, - @IContextKeyService contextKeyService: IContextKeyService, - @IMenuService menuService: IMenuService + @IInstantiationService private readonly instantiationService: IInstantiationService, + @IContextMenuService private readonly contextMenuService: IContextMenuService, + @IContextKeyService private readonly contextKeyService: IContextKeyService, + @IMenuService private readonly menuService: IMenuService ) { super(); + } - this._betweenCellToolbar = this._register(new ToolBar(this._bottomCellToolbarContainer, contextMenuService, { + private _initialize(): ToolBar { + if (this._betweenCellToolbar) { + return this._betweenCellToolbar; + } + + const betweenCellToolbar = this._register(new ToolBar(this._bottomCellToolbarContainer, this.contextMenuService, { actionViewItemProvider: action => { if (action instanceof MenuItemAction) { if (this._notebookEditor.notebookOptions.getLayoutConfiguration().insertToolbarAlignment === 'center') { - return instantiationService.createInstance(CodiconActionViewItem, action, undefined); + return this.instantiationService.createInstance(CodiconActionViewItem, action, undefined); } else { - return instantiationService.createInstance(MenuEntryActionViewItem, action, undefined); + return this.instantiationService.createInstance(MenuEntryActionViewItem, action, undefined); } } @@ -51,10 +57,11 @@ export class BetweenCellToolbar extends CellPart { } })); - const menu = this._register(menuService.createMenu(this._notebookEditor.creationOptions.menuIds.cellInsertToolbar, contextKeyService)); + this._betweenCellToolbar = betweenCellToolbar; + const menu = this._register(this.menuService.createMenu(this._notebookEditor.creationOptions.menuIds.cellInsertToolbar, this.contextKeyService)); const updateActions = () => { const actions = getCellToolbarActions(menu); - this._betweenCellToolbar.setActions(actions.primary, actions.secondary); + betweenCellToolbar.setActions(actions.primary, actions.secondary); }; this._register(menu.onDidChange(() => updateActions())); @@ -63,15 +70,15 @@ export class BetweenCellToolbar extends CellPart { updateActions(); } })); - updateActions(); - } - updateContext(context: INotebookCellActionContext) { - this._betweenCellToolbar.context = context; + updateActions(); + + return betweenCellToolbar; } override didRenderCell(element: ICellViewModel): void { - this._betweenCellToolbar.context = { + const betweenCellToolbar = this._initialize(); + betweenCellToolbar.context = { ui: true, cell: element, notebookEditor: this._notebookEditor, @@ -90,53 +97,110 @@ export interface ICssClassDelegate { toggle: (className: string, force?: boolean) => void; } -export class CellTitleToolbarPart extends CellPart { - private _toolbar: ToolBar; - private _titleMenu: IMenu; - private _deleteToolbar: ToolBar; - private _deleteMenu: IMenu; +interface CellTitleToolbarModel { + titleMenu: IMenu; + actions: { primary: IAction[]; secondary: IAction[] }; + deleteMenu: IMenu; + deleteActions: { primary: IAction[]; secondary: IAction[] }; +} + +interface CellTitleToolbarView { + toolbar: ToolBar; + deleteToolbar: ToolBar; +} + +export class CellTitleToolbarPart extends CellOverlayPart { + private _model: CellTitleToolbarModel | undefined; + private _view: CellTitleToolbarView | undefined; private readonly _onDidUpdateActions: Emitter = this._register(new Emitter()); readonly onDidUpdateActions: Event = this._onDidUpdateActions.event; get hasActions(): boolean { - return this._toolbar.getItemsLength() + this._deleteToolbar.getItemsLength() > 0; + if (!this._model) { + return false; + } + + return this._model.actions.primary.length + + this._model.actions.secondary.length + + this._model.deleteActions.primary.length + + this._model.deleteActions.secondary.length + > 0; } constructor( private readonly toolbarContainer: HTMLElement, private readonly _rootClassDelegate: ICssClassDelegate, - toolbarId: MenuId, - deleteToolbarId: MenuId, + private readonly toolbarId: MenuId, + private readonly deleteToolbarId: MenuId, private readonly _notebookEditor: INotebookEditorDelegate, - @IContextKeyService contextKeyService: IContextKeyService, - @IMenuService menuService: IMenuService, - @IInstantiationService instantiationService: IInstantiationService, + @IContextKeyService private readonly contextKeyService: IContextKeyService, + @IMenuService private readonly menuService: IMenuService, + @IInstantiationService private readonly instantiationService: IInstantiationService, ) { super(); + } - this._toolbar = instantiationService.createInstance(WorkbenchToolBar, toolbarContainer, { + private _initializeModel(): CellTitleToolbarModel { + if (this._model) { + return this._model; + } + + const titleMenu = this._register(this.menuService.createMenu(this.toolbarId, this.contextKeyService)); + const deleteMenu = this._register(this.menuService.createMenu(this.deleteToolbarId, this.contextKeyService)); + const actions = getCellToolbarActions(titleMenu); + const deleteActions = !this._notebookEditor.creationOptions.isReadOnly ? getCellToolbarActions(deleteMenu) : { + primary: [], + secondary: [] + }; + + this._model = { + titleMenu, + actions, + deleteMenu, + deleteActions + }; + + return this._model; + } + + private _initialize(model: CellTitleToolbarModel): CellTitleToolbarView { + if (this._view) { + return this._view; + } + + const toolbar = this.instantiationService.createInstance(WorkbenchToolBar, this.toolbarContainer, { actionViewItemProvider: action => { - return createActionViewItem(instantiationService, action); + return createActionViewItem(this.instantiationService, action); }, renderDropdownAsChildElement: true }); - this._titleMenu = this._register(menuService.createMenu(toolbarId, contextKeyService)); - this._deleteToolbar = this._register(instantiationService.invokeFunction(accessor => createDeleteToolbar(accessor, toolbarContainer, 'cell-delete-toolbar'))); - this._deleteMenu = this._register(menuService.createMenu(deleteToolbarId, contextKeyService)); - if (!this._notebookEditor.creationOptions.isReadOnly) { - const deleteActions = getCellToolbarActions(this._deleteMenu); - this._deleteToolbar.setActions(deleteActions.primary, deleteActions.secondary); + const deleteToolbar = this._register(this.instantiationService.invokeFunction(accessor => createDeleteToolbar(accessor, this.toolbarContainer, 'cell-delete-toolbar'))); + if (model.deleteActions.primary.length !== 0 || model.deleteActions.secondary.length !== 0) { + deleteToolbar.setActions(model.deleteActions.primary, model.deleteActions.secondary); } - this.setupChangeListeners(this._toolbar, this._titleMenu); - this.setupChangeListeners(this._deleteToolbar, this._deleteMenu); + this.setupChangeListeners(toolbar, model.titleMenu); + this.setupChangeListeners(deleteToolbar, model.deleteMenu); + + this._view = { + toolbar, + deleteToolbar + }; + + return this._view; + } + + override prepareRenderCell(element: ICellViewModel): void { + this._initializeModel(); } override didRenderCell(element: ICellViewModel): void { + const model = this._initializeModel(); + const view = this._initialize(model); this.cellDisposables.add(registerStickyScroll(this._notebookEditor, element, this.toolbarContainer, { extraOffset: 4, min: -14 })); - this.updateContext({ + this.updateContext(view, { ui: true, cell: element, notebookEditor: this._notebookEditor, @@ -144,9 +208,9 @@ export class CellTitleToolbarPart extends CellPart { }); } - private updateContext(toolbarContext: INotebookCellActionContext) { - this._toolbar.context = toolbarContext; - this._deleteToolbar.context = toolbarContext; + private updateContext(view: CellTitleToolbarView, toolbarContext: INotebookCellActionContext) { + view.toolbar.context = toolbarContext; + view.deleteToolbar.context = toolbarContext; } private setupChangeListeners(toolbar: ToolBar, menu: IMenu): void { diff --git a/src/vs/workbench/contrib/notebook/browser/view/cellParts/codeCell.ts b/src/vs/workbench/contrib/notebook/browser/view/cellParts/codeCell.ts index bc47297e810..c8f786c707e 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/cellParts/codeCell.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/cellParts/codeCell.ts @@ -55,7 +55,7 @@ export class CodeCell extends Disposable { const cellEditorOptions = this._register(new CellEditorOptions(this.notebookEditor.getBaseCellEditorOptions(viewCell.language), this.notebookEditor.notebookOptions, this.configurationService)); this._outputContainerRenderer = this.instantiationService.createInstance(CellOutputContainer, notebookEditor, viewCell, templateData, { limit: 500 }); - this.cellParts = templateData.cellParts.concat([cellEditorOptions, this._outputContainerRenderer]); + this.cellParts = templateData.cellParts.concatContentPart([cellEditorOptions, this._outputContainerRenderer]); const editorHeight = this.calculateInitEditorHeight(); this.initializeEditor(editorHeight); @@ -100,7 +100,7 @@ export class CodeCell extends Disposable { } })); - this.cellParts.renderCell(this.viewCell); + this.cellParts.scheduleRenderCell(this.viewCell); this._register(toDisposable(() => { this.cellParts.unrenderCell(this.viewCell); @@ -468,12 +468,14 @@ export class CodeCell extends Disposable { const viewLayout = this.templateData.editor.getLayoutInfo(); this.viewCell.editorHeight = newHeight; this.relayoutCell(); - this.layoutEditor( - { - width: viewLayout.width, - height: newHeight - } - ); + DOM.scheduleAtNextAnimationFrame(() => { + this.layoutEditor( + { + width: viewLayout.width, + height: newHeight + } + ); + }); } relayoutCell() { diff --git a/src/vs/workbench/contrib/notebook/browser/view/cellParts/codeCellRunToolbar.ts b/src/vs/workbench/contrib/notebook/browser/view/cellParts/codeCellRunToolbar.ts index ab30afc1519..176621ea0c0 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/cellParts/codeCellRunToolbar.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/cellParts/codeCellRunToolbar.ts @@ -19,11 +19,11 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { INotebookCellActionContext } from 'vs/workbench/contrib/notebook/browser/controller/coreActions'; import { ICellViewModel, INotebookEditorDelegate } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; -import { CellPart } from 'vs/workbench/contrib/notebook/browser/view/cellPart'; +import { CellContentPart } from 'vs/workbench/contrib/notebook/browser/view/cellPart'; import { registerStickyScroll } from 'vs/workbench/contrib/notebook/browser/view/cellParts/stickyScroll'; import { NOTEBOOK_CELL_EXECUTION_STATE, NOTEBOOK_CELL_LIST_FOCUSED, NOTEBOOK_CELL_TYPE, NOTEBOOK_EDITOR_FOCUSED } from 'vs/workbench/contrib/notebook/common/notebookContextKeys'; -export class RunToolbar extends CellPart { +export class RunToolbar extends CellContentPart { private toolbar!: ToolBar; private primaryMenu: IMenu; diff --git a/src/vs/workbench/contrib/notebook/browser/view/cellParts/collapsedCellInput.ts b/src/vs/workbench/contrib/notebook/browser/view/cellParts/collapsedCellInput.ts index 4d29d44bc05..ceee7ec9ff9 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/cellParts/collapsedCellInput.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/cellParts/collapsedCellInput.ts @@ -5,9 +5,9 @@ import * as DOM from 'vs/base/browser/dom'; import { INotebookEditor } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; -import { CellPart } from 'vs/workbench/contrib/notebook/browser/view/cellPart'; +import { CellContentPart } from 'vs/workbench/contrib/notebook/browser/view/cellPart'; -export class CollapsedCellInput extends CellPart { +export class CollapsedCellInput extends CellContentPart { constructor( private readonly notebookEditor: INotebookEditor, cellInputCollapsedContainer: HTMLElement, diff --git a/src/vs/workbench/contrib/notebook/browser/view/cellParts/collapsedCellOutput.ts b/src/vs/workbench/contrib/notebook/browser/view/cellParts/collapsedCellOutput.ts index 560a6f009a1..96cda1a0fcb 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/cellParts/collapsedCellOutput.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/cellParts/collapsedCellOutput.ts @@ -8,11 +8,11 @@ import { Codicon, CSSIcon } from 'vs/base/common/codicons'; import { localize } from 'vs/nls'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { EXPAND_CELL_OUTPUT_COMMAND_ID, INotebookEditor } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; -import { CellPart } from 'vs/workbench/contrib/notebook/browser/view/cellPart'; +import { CellContentPart } from 'vs/workbench/contrib/notebook/browser/view/cellPart'; const $ = DOM.$; -export class CollapsedCellOutput extends CellPart { +export class CollapsedCellOutput extends CellContentPart { constructor( private readonly notebookEditor: INotebookEditor, cellOutputCollapseContainer: HTMLElement, diff --git a/src/vs/workbench/contrib/notebook/browser/view/cellParts/foldedCellHint.ts b/src/vs/workbench/contrib/notebook/browser/view/cellParts/foldedCellHint.ts index 44d8f209cbe..84358d83847 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/cellParts/foldedCellHint.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/cellParts/foldedCellHint.ts @@ -8,10 +8,10 @@ import { Codicon, CSSIcon } from 'vs/base/common/codicons'; import { localize } from 'vs/nls'; import { FoldingController } from 'vs/workbench/contrib/notebook/browser/controller/foldingController'; import { CellEditState, CellFoldingState, INotebookEditor } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; -import { CellPart } from 'vs/workbench/contrib/notebook/browser/view/cellPart'; +import { CellContentPart } from 'vs/workbench/contrib/notebook/browser/view/cellPart'; import { MarkupCellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/markupCellViewModel'; -export class FoldedCellHint extends CellPart { +export class FoldedCellHint extends CellContentPart { constructor( private readonly _notebookEditor: INotebookEditor, diff --git a/src/vs/workbench/contrib/notebook/browser/view/cellParts/markupCell.ts b/src/vs/workbench/contrib/notebook/browser/view/cellParts/markupCell.ts index 8dbe08da1df..368f20a9320 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/cellParts/markupCell.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/cellParts/markupCell.ts @@ -69,7 +69,7 @@ export class MarkupCell extends Disposable { this.registerListeners(); // update for init state - this.templateData.cellParts.renderCell(this.viewCell); + this.templateData.cellParts.scheduleRenderCell(this.viewCell); this._register(toDisposable(() => { this.templateData.cellParts.unrenderCell(this.viewCell); diff --git a/src/vs/workbench/contrib/notebook/browser/view/renderers/cellRenderer.ts b/src/vs/workbench/contrib/notebook/browser/view/renderers/cellRenderer.ts index 7832f49b365..921e5795d2f 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/renderers/cellRenderer.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/renderers/cellRenderer.ts @@ -166,8 +166,6 @@ export class MarkupCellRenderer extends AbstractCellRenderer implements IListRen const focusIndicatorBottom = new FastDomNode(DOM.append(container, $('.cell-focus-indicator.cell-focus-indicator-bottom'))); const cellParts = new CellPartsCollection([ - titleToolbar, - templateDisposables.add(scopedInstaService.createInstance(BetweenCellToolbar, this.notebookEditor, titleToolbarContainer, bottomCellContainer)), templateDisposables.add(scopedInstaService.createInstance(CellEditorStatusBar, this.notebookEditor, container, editorPart, undefined)), templateDisposables.add(new CellFocusIndicator(this.notebookEditor, titleToolbar, focusIndicatorTop, focusIndicatorLeft, focusIndicatorRight, focusIndicatorBottom)), templateDisposables.add(new FoldedCellHint(this.notebookEditor, DOM.append(container, $('.notebook-folded-hint')))), @@ -177,6 +175,9 @@ export class MarkupCellRenderer extends AbstractCellRenderer implements IListRen templateDisposables.add(new CellFocusPart(container, undefined, this.notebookEditor)), templateDisposables.add(new CellDragAndDropPart(container)), templateDisposables.add(scopedInstaService.createInstance(CellContextKeyPart, this.notebookEditor)), + ], [ + titleToolbar, + templateDisposables.add(scopedInstaService.createInstance(BetweenCellToolbar, this.notebookEditor, titleToolbarContainer, bottomCellContainer)) ]); const templateData: MarkdownCellRenderTemplate = { @@ -307,8 +308,6 @@ export class CodeCellRenderer extends AbstractCellRenderer implements IListRende const focusIndicatorPart = templateDisposables.add(new CellFocusIndicator(this.notebookEditor, titleToolbar, focusIndicatorTop, focusIndicatorLeft, focusIndicatorRight, focusIndicatorBottom)); const cellParts = new CellPartsCollection([ focusIndicatorPart, - titleToolbar, - templateDisposables.add(scopedInstaService.createInstance(BetweenCellToolbar, this.notebookEditor, titleToolbarContainer, bottomCellToolbarContainer)), templateDisposables.add(scopedInstaService.createInstance(CellEditorStatusBar, this.notebookEditor, container, editorPart, editor)), templateDisposables.add(scopedInstaService.createInstance(CellProgressBar, editorPart, cellInputCollapsedContainer)), templateDisposables.add(scopedInstaService.createInstance(RunToolbar, this.notebookEditor, contextKeyService, container, runButtonContainer)), @@ -320,6 +319,9 @@ export class CodeCellRenderer extends AbstractCellRenderer implements IListRende templateDisposables.add(new CellFocusPart(container, focusSinkElement, this.notebookEditor)), templateDisposables.add(new CellDragAndDropPart(container)), templateDisposables.add(scopedInstaService.createInstance(CellContextKeyPart, this.notebookEditor)), + ], [ + titleToolbar, + templateDisposables.add(scopedInstaService.createInstance(BetweenCellToolbar, this.notebookEditor, titleToolbarContainer, bottomCellToolbarContainer)) ]); const templateData: CodeCellRenderTemplate = { From 3065b499e04511ed9404a546ff431ffde2197db2 Mon Sep 17 00:00:00 2001 From: rebornix Date: Sun, 6 Nov 2022 22:06:35 -0800 Subject: [PATCH 153/185] Overlay part needs layout update in didRenderCell --- .../browser/view/cellParts/cellToolbars.ts | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellToolbars.ts b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellToolbars.ts index 5e3018eec42..e7abd51b699 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellToolbars.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/cellParts/cellToolbars.ts @@ -84,6 +84,7 @@ export class BetweenCellToolbar extends CellOverlayPart { notebookEditor: this._notebookEditor, $mid: MarshalledId.NotebookCellActionContext }; + this.updateInternalLayoutNow(element); } override updateInternalLayoutNow(element: ICellViewModel) { @@ -163,7 +164,7 @@ export class CellTitleToolbarPart extends CellOverlayPart { return this._model; } - private _initialize(model: CellTitleToolbarModel): CellTitleToolbarView { + private _initialize(model: CellTitleToolbarModel, element: ICellViewModel): CellTitleToolbarView { if (this._view) { return this._view; } @@ -180,8 +181,8 @@ export class CellTitleToolbarPart extends CellOverlayPart { deleteToolbar.setActions(model.deleteActions.primary, model.deleteActions.secondary); } - this.setupChangeListeners(toolbar, model.titleMenu); - this.setupChangeListeners(deleteToolbar, model.deleteMenu); + this.setupChangeListeners(toolbar, model.titleMenu, model.actions); + this.setupChangeListeners(deleteToolbar, model.deleteMenu, model.deleteActions); this._view = { toolbar, @@ -197,7 +198,7 @@ export class CellTitleToolbarPart extends CellOverlayPart { override didRenderCell(element: ICellViewModel): void { const model = this._initializeModel(); - const view = this._initialize(model); + const view = this._initialize(model, element); this.cellDisposables.add(registerStickyScroll(this._notebookEditor, element, this.toolbarContainer, { extraOffset: 4, min: -14 })); this.updateContext(view, { @@ -213,19 +214,21 @@ export class CellTitleToolbarPart extends CellOverlayPart { view.deleteToolbar.context = toolbarContext; } - private setupChangeListeners(toolbar: ToolBar, menu: IMenu): void { + private setupChangeListeners(toolbar: ToolBar, menu: IMenu, initActions: { primary: IAction[]; secondary: IAction[] }): void { // #103926 let dropdownIsVisible = false; let deferredUpdate: (() => void) | undefined; - this.updateActions(toolbar, menu); + this.updateActions(toolbar, initActions); this._register(menu.onDidChange(() => { if (dropdownIsVisible) { - deferredUpdate = () => this.updateActions(toolbar, menu); + const actions = getCellToolbarActions(menu); + deferredUpdate = () => this.updateActions(toolbar, actions); return; } - this.updateActions(toolbar, menu); + const actions = getCellToolbarActions(menu); + this.updateActions(toolbar, actions); })); this._rootClassDelegate.toggle('cell-toolbar-dropdown-active', false); this._register(toolbar.onDidChangeDropdownVisibility(visible => { @@ -242,10 +245,7 @@ export class CellTitleToolbarPart extends CellOverlayPart { })); } - private updateActions(toolbar: ToolBar, menu: IMenu) { - - const actions = getCellToolbarActions(menu); - + private updateActions(toolbar: ToolBar, actions: { primary: IAction[]; secondary: IAction[] }) { const hadFocus = DOM.isAncestor(document.activeElement, toolbar.getElement()); toolbar.setActions(actions.primary, actions.secondary); if (hadFocus) { From c90f36e95b2447e2e0af50ecd4e90358258b15c1 Mon Sep 17 00:00:00 2001 From: Mark Zuber Date: Mon, 7 Nov 2022 01:07:28 -0800 Subject: [PATCH 154/185] Update bootstrap-node.js to check for Array.isArray (#165289) * Update bootstrap-node.js to check for Array.isArray * Update --- src/bootstrap-node.js | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/bootstrap-node.js b/src/bootstrap-node.js index 47f3443873c..914b8290380 100644 --- a/src/bootstrap-node.js +++ b/src/bootstrap-node.js @@ -78,11 +78,14 @@ exports.removeGlobalNodeModuleLookupPaths = function () { // @ts-ignore Module._resolveLookupPaths = function (moduleName, parent) { const paths = originalResolveLookupPaths(moduleName, parent); - let commonSuffixLength = 0; - while (commonSuffixLength < paths.length && paths[paths.length - 1 - commonSuffixLength] === globalPaths[globalPaths.length - 1 - commonSuffixLength]) { - commonSuffixLength++; + if (Array.isArray(paths)) { + let commonSuffixLength = 0; + while (commonSuffixLength < paths.length && paths[paths.length - 1 - commonSuffixLength] === globalPaths[globalPaths.length - 1 - commonSuffixLength]) { + commonSuffixLength++; + } + return paths.slice(0, paths.length - commonSuffixLength); } - return paths.slice(0, paths.length - commonSuffixLength); + return paths; }; }; From c9200f12be2fee33a7ad63741fc36131db4dcd01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Mon, 7 Nov 2022 03:18:01 -0800 Subject: [PATCH 155/185] update distro (#165691) --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index ed6145dfcd6..397217912f3 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.74.0", - "distro": "51e5bb745ed01b333d96df102d750c9ec33ffe23", + "distro": "ac4b725ef14bfa1d8e3a768c5caab2a75cd6ad99", "author": { "name": "Microsoft Corporation" }, @@ -237,4 +237,4 @@ "elliptic": "^6.5.3", "nwmatcher": "^1.4.4" } -} +} \ No newline at end of file From 6933e6fcef4b9b8e373130082bb6da0f2bb2b68b Mon Sep 17 00:00:00 2001 From: Henning Dieterichs Date: Mon, 7 Nov 2022 12:19:04 +0100 Subject: [PATCH 156/185] Implements #164574 for experimental diff algorithm. (#165136) --- .../common/diff/algorithms/diffAlgorithm.ts | 12 ------ .../diff/algorithms/joinSequenceDiffs.ts | 2 +- .../common/diff/standardLinesDiffComputer.ts | 39 +++++++++++++++++-- 3 files changed, 36 insertions(+), 17 deletions(-) diff --git a/src/vs/editor/common/diff/algorithms/diffAlgorithm.ts b/src/vs/editor/common/diff/algorithms/diffAlgorithm.ts index 12a9e4faf5d..0222a85c4b5 100644 --- a/src/vs/editor/common/diff/algorithms/diffAlgorithm.ts +++ b/src/vs/editor/common/diff/algorithms/diffAlgorithm.ts @@ -59,15 +59,3 @@ export interface ISequence { */ getBoundaryScore?(length: number): number; } - -export class SequenceFromIntArray implements ISequence { - constructor(private readonly arr: number[]) { } - - getElement(offset: number): number { - return this.arr[offset]; - } - - get length(): number { - return this.arr.length; - } -} diff --git a/src/vs/editor/common/diff/algorithms/joinSequenceDiffs.ts b/src/vs/editor/common/diff/algorithms/joinSequenceDiffs.ts index 59ac41dafc3..ae370b5a693 100644 --- a/src/vs/editor/common/diff/algorithms/joinSequenceDiffs.ts +++ b/src/vs/editor/common/diff/algorithms/joinSequenceDiffs.ts @@ -120,7 +120,7 @@ function shiftDiffToBetterPosition(diff: SequenceDiff, sequence1: ISequence, seq let bestDelta = 0; let bestScore = -1; // find best scored delta - for (let delta = -deltaBefore; delta < deltaAfter; delta++) { + for (let delta = -deltaBefore; delta <= deltaAfter; delta++) { const seq2OffsetStart = diff.seq2Range.start + delta; const seq2OffsetEndExclusive = diff.seq2Range.endExclusive + delta; const seq1Offset = diff.seq1Range.start + delta; diff --git a/src/vs/editor/common/diff/standardLinesDiffComputer.ts b/src/vs/editor/common/diff/standardLinesDiffComputer.ts index 418ac6fd3e8..63e1fda4e42 100644 --- a/src/vs/editor/common/diff/standardLinesDiffComputer.ts +++ b/src/vs/editor/common/diff/standardLinesDiffComputer.ts @@ -7,7 +7,7 @@ import { assertFn, checkAdjacentItems } from 'vs/base/common/assert'; import { CharCode } from 'vs/base/common/charCode'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; -import { SequenceFromIntArray, OffsetRange, SequenceDiff, ISequence } from 'vs/editor/common/diff/algorithms/diffAlgorithm'; +import { OffsetRange, SequenceDiff, ISequence } from 'vs/editor/common/diff/algorithms/diffAlgorithm'; import { DynamicProgrammingDiffing } from 'vs/editor/common/diff/algorithms/dynamicProgrammingDiffing'; import { optimizeSequenceDiffs } from 'vs/editor/common/diff/algorithms/joinSequenceDiffs'; import { MyersDiffAlgorithm } from 'vs/editor/common/diff/algorithms/myersDiffAlgorithm'; @@ -34,10 +34,10 @@ export class StandardLinesDiffComputer implements ILinesDiffComputer { const srcDocLines = originalLines.map((l) => getOrCreateHash(l.trim())); const tgtDocLines = modifiedLines.map((l) => getOrCreateHash(l.trim())); - const sequence1 = new SequenceFromIntArray(srcDocLines); - const sequence2 = new SequenceFromIntArray(tgtDocLines); + const sequence1 = new LineSequence(srcDocLines, originalLines); + const sequence2 = new LineSequence(tgtDocLines, modifiedLines); - const lineAlignments = (() => { + let lineAlignments = (() => { if (sequence1.length + sequence2.length < 1500) { // Use the improved algorithm for small files return this.dynamicProgrammingDiffing.compute( @@ -58,6 +58,8 @@ export class StandardLinesDiffComputer implements ILinesDiffComputer { ); })(); + lineAlignments = optimizeSequenceDiffs(sequence1, sequence2, lineAlignments); + const alignments: RangeMapping[] = []; const scanForWhitespaceChanges = (equalLinesCount: number) => { @@ -182,6 +184,35 @@ function* group(items: Iterable, shouldBeGrouped: (item1: T, item2: T) => } } +export class LineSequence implements ISequence { + constructor( + private readonly trimmedHash: number[], + private readonly lines: string[] + ) { } + + getElement(offset: number): number { + return this.trimmedHash[offset]; + } + + get length(): number { + return this.trimmedHash.length; + } + + getBoundaryScore(length: number): number { + const indentationBefore = length === 0 ? 0 : getIndentation(this.lines[length - 1]); + const indentationAfter = length === this.lines.length ? 0 : getIndentation(this.lines[length]); + return 1000 - (indentationBefore + indentationAfter); + } +} + +function getIndentation(str: string): number { + let i = 0; + while (i < str.length && (str.charCodeAt(i) === CharCode.Space || str.charCodeAt(i) === CharCode.Tab)) { + i++; + } + return i; +} + class Slice implements ISequence { private readonly elements: Int32Array; private readonly firstCharOnLineOffsets: Int32Array; From af4ea031fbb6347b8ebd55f3d798fe5810a946de Mon Sep 17 00:00:00 2001 From: Tyler James Leonhardt Date: Mon, 7 Nov 2022 03:41:05 -0800 Subject: [PATCH 157/185] Use the session access flow (#165567) * Use the session access flow At some point I accidentally stopped using `requestSessionAccess`. It helps a ton when you have multiple extensions that are requesting the same scopes. This re-uses it. Also fixed a leaking disposable. * clean up session preference a bit * use new api in one more place --- .../api/browser/mainThreadAuthentication.ts | 46 +++++++++++++------ .../browser/extHostAuthentication.test.ts | 24 +++++----- .../browser/authenticationService.ts | 42 +++++++++++------ .../authentication/common/authentication.ts | 5 +- 4 files changed, 76 insertions(+), 41 deletions(-) diff --git a/src/vs/workbench/api/browser/mainThreadAuthentication.ts b/src/vs/workbench/api/browser/mainThreadAuthentication.ts index d48b9079fe7..a637307493c 100644 --- a/src/vs/workbench/api/browser/mainThreadAuthentication.ts +++ b/src/vs/workbench/api/browser/mainThreadAuthentication.ts @@ -199,12 +199,6 @@ export class MainThreadAuthentication extends Disposable implements MainThreadAu return choice === 0; } - private async setTrustedExtensionAndAccountPreference(providerId: string, accountName: string, extensionId: string, extensionName: string, sessionId: string): Promise { - this.authenticationService.updatedAllowedExtension(providerId, accountName, extensionId, extensionName, true); - this.storageService.store(`${extensionName}-${providerId}`, sessionId, StorageScope.APPLICATION, StorageTarget.MACHINE); - - } - private async doGetSession(providerId: string, scopes: string[], extensionId: string, extensionName: string, options: AuthenticationGetSessionOptions): Promise { const sessions = await this.authenticationService.getSessions(providerId, scopes, true); const supportsMultipleAccounts = this.authenticationService.supportsMultipleAccounts(providerId); @@ -224,9 +218,12 @@ export class MainThreadAuthentication extends Disposable implements MainThreadAu if (!options.forceNewSession && sessions.length) { if (supportsMultipleAccounts) { if (options.clearSessionPreference) { - this.storageService.remove(`${extensionName}-${providerId}`, StorageScope.APPLICATION); + // Clearing the session preference is usually paired with createIfNone, so just remove the preference and + // defer to the rest of the logic in this function to choose the session. + this.authenticationService.removeSessionPreference(providerId, extensionId, scopes); } else { - const existingSessionPreference = this.storageService.get(`${extensionName}-${providerId}`, StorageScope.APPLICATION); + // If we have an existing session preference, use that. If not, we'll return any valid session at the end of this function. + const existingSessionPreference = this.authenticationService.getSessionPreference(providerId, extensionId, scopes); if (existingSessionPreference) { const matchingSession = sessions.find(session => session.id === existingSessionPreference); if (matchingSession && this.authenticationService.isAccessAllowed(providerId, matchingSession.account.label, extensionId)) { @@ -256,17 +253,36 @@ export class MainThreadAuthentication extends Disposable implements MainThreadAu const session = sessions?.length && !options.forceNewSession && supportsMultipleAccounts ? await this.authenticationService.selectSession(providerId, extensionId, extensionName, scopes, sessions) : await this.authenticationService.createSession(providerId, scopes, true); - await this.setTrustedExtensionAndAccountPreference(providerId, session.account.label, extensionId, extensionName, session.id); + this.authenticationService.updateAllowedExtension(providerId, session.account.label, extensionId, extensionName, true); + this.authenticationService.updateSessionPreference(providerId, extensionId, session); return session; } - // passive flows (silent or default) - - const validSession = sessions.find(s => this.authenticationService.isAccessAllowed(providerId, s.account.label, extensionId)); - if (!options.silent && !validSession) { - await this.authenticationService.requestNewSession(providerId, scopes, extensionId, extensionName); + // For the silent flows, if we have a session, even though it may not be the user's preference, we'll return it anyway because it might be for a specific + // set of scopes. + const validSession = sessions.find(session => this.authenticationService.isAccessAllowed(providerId, session.account.label, extensionId)); + if (validSession) { + // Migration. If we have a valid session, but no preference, we'll set the preference to the valid session. + // TODO: Remove this after in a few releases. + if (!this.authenticationService.getSessionPreference(providerId, extensionId, scopes)) { + if (this.storageService.get(`${extensionName}-${providerId}`, StorageScope.APPLICATION)) { + this.storageService.remove(`${extensionName}-${providerId}`, StorageScope.APPLICATION); + } + this.authenticationService.updateAllowedExtension(providerId, validSession.account.label, extensionId, extensionName, true); + this.authenticationService.updateSessionPreference(providerId, extensionId, validSession); + } + return validSession; } - return validSession; + + // passive flows (silent or default) + if (!options.silent) { + // If there is a potential session, but the extension doesn't have access to it, use the "grant access" flow, + // otherwise request a new one. + sessions.length + ? this.authenticationService.requestSessionAccess(providerId, extensionId, extensionName, scopes, sessions) + : await this.authenticationService.requestNewSession(providerId, scopes, extensionId, extensionName); + } + return undefined; } async $getSession(providerId: string, scopes: string[], extensionId: string, extensionName: string, options: AuthenticationGetSessionOptions): Promise { diff --git a/src/vs/workbench/api/test/browser/extHostAuthentication.test.ts b/src/vs/workbench/api/test/browser/extHostAuthentication.test.ts index 7d4a9f808fb..2ffc1ce07b6 100644 --- a/src/vs/workbench/api/test/browser/extHostAuthentication.test.ts +++ b/src/vs/workbench/api/test/browser/extHostAuthentication.test.ts @@ -171,9 +171,9 @@ suite('ExtHostAuthentication', () => { scopes, {}); - assert.strictEqual(session.id, session2?.id); - assert.strictEqual(session.scopes[0], session2?.scopes[0]); - assert.strictEqual(session.accessToken, session2?.accessToken); + assert.strictEqual(session2?.id, session.id); + assert.strictEqual(session2?.scopes[0], session.scopes[0]); + assert.strictEqual(session2?.accessToken, session.accessToken); }); // should behave the same as createIfNone: false @@ -312,9 +312,9 @@ suite('ExtHostAuthentication', () => { // clearing session preference causes us to get the first session // because it would normally show a quick pick for the user to choose - assert.strictEqual(session.id, session3?.id); - assert.strictEqual(session.scopes[0], session3?.scopes[0]); - assert.strictEqual(session.accessToken, session3?.accessToken); + assert.strictEqual(session3?.id, session.id); + assert.strictEqual(session3?.scopes[0], session.scopes[0]); + assert.strictEqual(session3?.accessToken, session.accessToken); }); test('silently getting session should return a session (if any) regardless of preference - fixes #137819', async () => { @@ -347,18 +347,18 @@ suite('ExtHostAuthentication', () => { 'test-multiple', scopes, {}); - assert.strictEqual(session.id, shouldBeSession1?.id); - assert.strictEqual(session.scopes[0], shouldBeSession1?.scopes[0]); - assert.strictEqual(session.accessToken, shouldBeSession1?.accessToken); + assert.strictEqual(shouldBeSession1?.id, session.id); + assert.strictEqual(shouldBeSession1?.scopes[0], session.scopes[0]); + assert.strictEqual(shouldBeSession1?.accessToken, session.accessToken); const shouldBeSession2 = await extHostAuthentication.getSession( extensionDescription, 'test-multiple', scopes2, {}); - assert.strictEqual(session2.id, shouldBeSession2?.id); - assert.strictEqual(session2.scopes[0], shouldBeSession2?.scopes[0]); - assert.strictEqual(session2.accessToken, shouldBeSession2?.accessToken); + assert.strictEqual(shouldBeSession2?.id, session2.id); + assert.strictEqual(shouldBeSession2?.scopes[0], session2.scopes[0]); + assert.strictEqual(shouldBeSession2?.accessToken, session2.accessToken); }); //#endregion diff --git a/src/vs/workbench/services/authentication/browser/authenticationService.ts b/src/vs/workbench/services/authentication/browser/authenticationService.ts index 7d6520effe5..1d9ac762f1f 100644 --- a/src/vs/workbench/services/authentication/browser/authenticationService.ts +++ b/src/vs/workbench/services/authentication/browser/authenticationService.ts @@ -387,7 +387,7 @@ export class AuthenticationService extends Disposable implements IAuthentication return undefined; } - async updatedAllowedExtension(providerId: string, accountName: string, extensionId: string, extensionName: string, isAllowed: boolean): Promise { + updateAllowedExtension(providerId: string, accountName: string, extensionId: string, extensionName: string, isAllowed: boolean): void { const allowList = readAllowedExtensions(this.storageService, providerId, accountName); const index = allowList.findIndex(extension => extension.id === extensionId); if (index === -1) { @@ -396,9 +396,29 @@ export class AuthenticationService extends Disposable implements IAuthentication allowList[index].allowed = isAllowed; } - await this.storageService.store(`${providerId}-${accountName}`, JSON.stringify(allowList), StorageScope.APPLICATION, StorageTarget.USER); + this.storageService.store(`${providerId}-${accountName}`, JSON.stringify(allowList), StorageScope.APPLICATION, StorageTarget.USER); } + //#region Session Preference + + updateSessionPreference(providerId: string, extensionId: string, session: AuthenticationSession): void { + // The 3 parts of this key are important: + // * Extension id: The extension that has a preference + // * Provider id: The provider that the preference is for + // * The scopes: The subset of sessions that the preference applies to + this.storageService.store(`${extensionId}-${providerId}-${session.scopes.join(' ')}`, session.id, StorageScope.APPLICATION, StorageTarget.MACHINE); + } + + getSessionPreference(providerId: string, extensionId: string, scopes: string[]): string | undefined { + return this.storageService.get(`${extensionId}-${providerId}-${scopes.join(' ')}`, StorageScope.APPLICATION, undefined); + } + + removeSessionPreference(providerId: string, extensionId: string, scopes: string[]): void { + this.storageService.remove(`${extensionId}-${providerId}-${scopes.join(' ')}`, StorageScope.APPLICATION); + } + + //#endregion + async showGetSessionPrompt(providerId: string, accountName: string, extensionId: string, extensionName: string): Promise { const providerName = this.getLabel(providerId); const { choice } = await this.dialogService.show( @@ -413,7 +433,7 @@ export class AuthenticationService extends Disposable implements IAuthentication const cancelled = choice === 2; const allowed = choice === 0; if (!cancelled) { - this.updatedAllowedExtension(providerId, accountName, extensionId, extensionName, allowed); + this.updateAllowedExtension(providerId, accountName, extensionId, extensionName, allowed); this.removeAccessRequest(providerId, extensionId); } @@ -458,10 +478,9 @@ export class AuthenticationService extends Disposable implements IAuthentication const session = quickPick.selectedItems[0].session ?? await this.createSession(providerId, scopes); const accountName = session.account.label; - this.updatedAllowedExtension(providerId, accountName, extensionId, extensionName, true); - + this.updateAllowedExtension(providerId, accountName, extensionId, extensionName, true); + this.updateSessionPreference(providerId, extensionId, session); this.removeAccessRequest(providerId, extensionId); - this.storageService.store(`${extensionName}-${providerId}`, session.id, StorageScope.APPLICATION, StorageTarget.MACHINE); quickPick.dispose(); resolve(session); @@ -551,9 +570,10 @@ export class AuthenticationService extends Disposable implements IAuthentication // since this is sync and returns a disposable. So, wait for registration event to fire that indicates the // provider is now in the map. await new Promise((resolve, _) => { - this.onDidRegisterAuthenticationProvider(e => { + const dispose = this.onDidRegisterAuthenticationProvider(e => { if (e.id === providerId) { provider = this._authenticationProviders.get(providerId); + dispose.dispose(); resolve(); } }); @@ -594,14 +614,10 @@ export class AuthenticationService extends Disposable implements IAuthentication id: commandId, handler: async (accessor) => { const authenticationService = accessor.get(IAuthenticationService); - const storageService = accessor.get(IStorageService); const session = await authenticationService.createSession(providerId, scopes); - // Add extension to allow list since user explicitly signed in on behalf of it - this.updatedAllowedExtension(providerId, session.account.label, extensionId, extensionName, true); - - // And also set it as the preferred account for the extension - storageService.store(`${extensionName}-${providerId}`, session.id, StorageScope.APPLICATION, StorageTarget.MACHINE); + this.updateAllowedExtension(providerId, session.account.label, extensionId, extensionName, true); + this.updateSessionPreference(providerId, extensionId, session); } }); diff --git a/src/vs/workbench/services/authentication/common/authentication.ts b/src/vs/workbench/services/authentication/common/authentication.ts index 9083d3e6528..c1bb22a7d0b 100644 --- a/src/vs/workbench/services/authentication/common/authentication.ts +++ b/src/vs/workbench/services/authentication/common/authentication.ts @@ -37,7 +37,10 @@ export interface IAuthenticationService { registerAuthenticationProvider(id: string, provider: IAuthenticationProvider): void; unregisterAuthenticationProvider(id: string): void; isAccessAllowed(providerId: string, accountName: string, extensionId: string): boolean | undefined; - updatedAllowedExtension(providerId: string, accountName: string, extensionId: string, extensionName: string, isAllowed: boolean): Promise; + updateAllowedExtension(providerId: string, accountName: string, extensionId: string, extensionName: string, isAllowed: boolean): void; + updateSessionPreference(providerId: string, extensionId: string, session: AuthenticationSession): void; + getSessionPreference(providerId: string, extensionId: string, scopes: string[]): string | undefined; + removeSessionPreference(providerId: string, extensionId: string, scopes: string[]): void; showGetSessionPrompt(providerId: string, accountName: string, extensionId: string, extensionName: string): Promise; selectSession(providerId: string, extensionId: string, extensionName: string, scopes: string[], possibleSessions: readonly AuthenticationSession[]): Promise; requestSessionAccess(providerId: string, extensionId: string, extensionName: string, scopes: string[], possibleSessions: readonly AuthenticationSession[]): void; From d3611df9871755d9dfb38434a4c6879cdb3edc37 Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Mon, 7 Nov 2022 15:15:56 +0100 Subject: [PATCH 158/185] Git - Optimistic UI updates for rebase continue (#165699) Optimistic UI updates for rebase continue --- extensions/git/src/repository.ts | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/extensions/git/src/repository.ts b/extensions/git/src/repository.ts index f86b0549f9a..c6123b9afc3 100644 --- a/extensions/git/src/repository.ts +++ b/extensions/git/src/repository.ts @@ -1265,7 +1265,8 @@ export class Repository implements Disposable { await this.repository.rebaseContinue(); await this.commitOperationCleanup(message, opts); - }); + }, + () => this.commitOperationGetOptimisticResourceGroups(opts)); } else { // Set post-commit command to render the correct action button this.commitCommandCenter.postCommitCommand = opts.postCommitCommand; @@ -1288,19 +1289,7 @@ export class Repository implements Disposable { await this.repository.commit(message, opts); await this.commitOperationCleanup(message, opts); }, - (): GitResourceGroups => { - let untrackedGroup: Resource[] | undefined = undefined, - workingTreeGroup: Resource[] | undefined = undefined; - - if (opts.all === 'tracked') { - workingTreeGroup = this.workingTreeGroup.resourceStates - .filter(r => r.type === Status.UNTRACKED); - } else if (opts.all) { - untrackedGroup = workingTreeGroup = []; - } - - return { indexGroup: [], untrackedGroup, workingTreeGroup }; - }); + () => this.commitOperationGetOptimisticResourceGroups(opts)); // Execute post-commit command await this.run(Operation.PostCommitCommand, async () => { @@ -1321,6 +1310,20 @@ export class Repository implements Disposable { this.closeDiffEditors(indexResources, workingGroupResources); } + private commitOperationGetOptimisticResourceGroups(opts: CommitOptions): GitResourceGroups { + let untrackedGroup: Resource[] | undefined = undefined, + workingTreeGroup: Resource[] | undefined = undefined; + + if (opts.all === 'tracked') { + workingTreeGroup = this.workingTreeGroup.resourceStates + .filter(r => r.type === Status.UNTRACKED); + } else if (opts.all) { + untrackedGroup = workingTreeGroup = []; + } + + return { indexGroup: [], mergeGroup: [], untrackedGroup, workingTreeGroup }; + } + async clean(resources: Uri[]): Promise { await this.run(Operation.Clean, async () => { const toClean: string[] = []; From 99a483872dbbfad97f1a349c98092c04283a93a6 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 7 Nov 2022 16:24:53 +0100 Subject: [PATCH 159/185] - clean up deleted profile synchronizers (#165713) - check if profile synchronizer matches collection --- .../common/userDataSyncService.ts | 36 ++++++++++++------- 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/src/vs/platform/userDataSync/common/userDataSyncService.ts b/src/vs/platform/userDataSync/common/userDataSyncService.ts index 2741e974dd2..4612d71e686 100644 --- a/src/vs/platform/userDataSync/common/userDataSyncService.ts +++ b/src/vs/platform/userDataSync/common/userDataSyncService.ts @@ -225,6 +225,14 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ const profileSynchronizer = this.getOrCreateActiveProfileSynchronizer(profile, syncProfile); this._syncErrors.push(...await this.syncProfile(profileSynchronizer, manifest, merge, executionId, token)); } + // Dispose & Delete profile synchronizers which do not exist anymore + for (const [key, profileSynchronizerItem] of this.activeProfileSynchronizers.entries()) { + if (this.userDataProfilesService.profiles.some(p => p.id === profileSynchronizerItem[0].profile.id)) { + continue; + } + profileSynchronizerItem[1].dispose(); + this.activeProfileSynchronizers.delete(key); + } } private async applyManualSync(manifest: IUserDataManifest | null, executionId: string, token: CancellationToken): Promise { @@ -472,6 +480,12 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ getOrCreateActiveProfileSynchronizer(profile: IUserDataProfile, syncProfile: ISyncUserDataProfile | undefined): ProfileSynchronizer { let activeProfileSynchronizer = this.activeProfileSynchronizers.get(profile.id); + if (activeProfileSynchronizer && activeProfileSynchronizer[0].collection !== syncProfile?.collection) { + this.logService.error('Profile synchronizer collection does not match with the remote sync profile collection'); + activeProfileSynchronizer[1].dispose(); + activeProfileSynchronizer = undefined; + this.activeProfileSynchronizers.delete(profile.id); + } if (!activeProfileSynchronizer) { const disposables = new DisposableStore(); const profileSynchronizer = disposables.add(this.instantiationService.createInstance(ProfileSynchronizer, profile, syncProfile?.collection)); @@ -525,11 +539,9 @@ class ProfileSynchronizer extends Disposable { private _onDidChangeConflicts = this._register(new Emitter()); readonly onDidChangeConflicts = this._onDidChangeConflicts.event; - get profile(): IUserDataProfile { return this._profile; } - constructor( - private _profile: IUserDataProfile, - private readonly collection: string | undefined, + readonly profile: IUserDataProfile, + readonly collection: string | undefined, @IUserDataSyncEnablementService private readonly userDataSyncEnablementService: IUserDataSyncEnablementService, @IInstantiationService private readonly instantiationService: IInstantiationService, @IExtensionGalleryService private readonly extensionGalleryService: IExtensionGalleryService, @@ -568,7 +580,7 @@ class ProfileSynchronizer extends Disposable { return; } if (syncResource === SyncResource.Profiles) { - if (!this._profile.isDefault) { + if (!this.profile.isDefault) { return; } if (!this.userDataProfilesService.isEnabled()) { @@ -608,13 +620,13 @@ class ProfileSynchronizer extends Disposable { createSynchronizer(syncResource: SyncResource): IUserDataSynchroniser & IDisposable { switch (syncResource) { - case SyncResource.Settings: return this.instantiationService.createInstance(SettingsSynchroniser, this._profile, this.collection); - case SyncResource.Keybindings: return this.instantiationService.createInstance(KeybindingsSynchroniser, this._profile, this.collection); - case SyncResource.Snippets: return this.instantiationService.createInstance(SnippetsSynchroniser, this._profile, this.collection); - case SyncResource.Tasks: return this.instantiationService.createInstance(TasksSynchroniser, this._profile, this.collection); - case SyncResource.GlobalState: return this.instantiationService.createInstance(GlobalStateSynchroniser, this._profile, this.collection); - case SyncResource.Extensions: return this.instantiationService.createInstance(ExtensionsSynchroniser, this._profile, this.collection); - case SyncResource.Profiles: return this.instantiationService.createInstance(UserDataProfilesManifestSynchroniser, this._profile, this.collection); + case SyncResource.Settings: return this.instantiationService.createInstance(SettingsSynchroniser, this.profile, this.collection); + case SyncResource.Keybindings: return this.instantiationService.createInstance(KeybindingsSynchroniser, this.profile, this.collection); + case SyncResource.Snippets: return this.instantiationService.createInstance(SnippetsSynchroniser, this.profile, this.collection); + case SyncResource.Tasks: return this.instantiationService.createInstance(TasksSynchroniser, this.profile, this.collection); + case SyncResource.GlobalState: return this.instantiationService.createInstance(GlobalStateSynchroniser, this.profile, this.collection); + case SyncResource.Extensions: return this.instantiationService.createInstance(ExtensionsSynchroniser, this.profile, this.collection); + case SyncResource.Profiles: return this.instantiationService.createInstance(UserDataProfilesManifestSynchroniser, this.profile, this.collection); } } From 9f22d98be4feb740a232f65049304858fc6f5a76 Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Mon, 7 Nov 2022 16:26:03 +0100 Subject: [PATCH 160/185] Add some more port forwarding logging (#165714) Part of #165424 --- src/vs/workbench/contrib/remote/browser/remoteExplorer.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/vs/workbench/contrib/remote/browser/remoteExplorer.ts b/src/vs/workbench/contrib/remote/browser/remoteExplorer.ts index afdd0dadfce..1d76b0416c5 100644 --- a/src/vs/workbench/contrib/remote/browser/remoteExplorer.ts +++ b/src/vs/workbench/contrib/remote/browser/remoteExplorer.ts @@ -558,13 +558,16 @@ class ProcAutomaticPortForwarding extends Disposable { for (const value of startingCandidates) { this.initialCandidates.add(makeAddress(value.host, value.port)); } + this.logService.debug(`ForwardedPorts: (ProcForwarding) Initial candidates set to ${startingCandidates.join(', ')}`); } private async forwardCandidates(): Promise { let attributes: Map | undefined; const allTunnels: RemoteTunnel[] = []; + this.logService.trace(`ForwardedPorts: (ProcForwarding) Attempting to forward ${this.remoteExplorerService.tunnelModel.candidates.length} candidates`); for (const value of this.remoteExplorerService.tunnelModel.candidates) { if (!value.detail) { + this.logService.trace(`ForwardedPorts: (ProcForwarding) Port ${value.port} missing detail`); continue; } @@ -586,18 +589,22 @@ class ProcAutomaticPortForwarding extends Disposable { const portAttributes = attributes?.get(value.port); if (portAttributes?.onAutoForward === OnPortForward.Ignore) { + this.logService.trace(`ForwardedPorts: (ProcForwarding) Port ${value.port} is ignored`); continue; } const forwarded = await this.remoteExplorerService.forward({ remote: value, source: AutoTunnelSource }, portAttributes ?? null); if (!alreadyForwarded && forwarded) { + this.logService.trace(`ForwardedPorts: (ProcForwarding) Port ${value.port} has been forwarded`); this.autoForwarded.add(address); } else if (forwarded) { + this.logService.trace(`ForwardedPorts: (ProcForwarding) Port ${value.port} has been notified`); this.notifiedOnly.add(address); } if (forwarded) { allTunnels.push(forwarded); } } + this.logService.trace(`ForwardedPorts: (ProcForwarding) Forwarded ${allTunnels.length} candidates`); if (allTunnels.length === 0) { return undefined; } From 070de6c570b34b332f00d6b426ab000f2b71da55 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 7 Nov 2022 17:19:40 +0100 Subject: [PATCH 161/185] flush log channels if they are visible (#165718) --- src/vs/workbench/api/common/extHostOutput.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/api/common/extHostOutput.ts b/src/vs/workbench/api/common/extHostOutput.ts index c8ccb609da0..c3c8afbb886 100644 --- a/src/vs/workbench/api/common/extHostOutput.ts +++ b/src/vs/workbench/api/common/extHostOutput.ts @@ -51,10 +51,6 @@ class ExtHostOutputChannel extends AbstractMessageLogger implements vscode.LogOu append(value: string): void { this.info(value); - if (this.visible) { - this.logger.flush(); - this.proxy.$update(this.id, OutputChannelUpdateMode.Append); - } } clear(): void { @@ -84,6 +80,10 @@ class ExtHostOutputChannel extends AbstractMessageLogger implements vscode.LogOu protected log(level: LogLevel, message: string): void { this.offset += VSBuffer.fromString(message).byteLength; log(this.logger, level, message); + if (this.visible) { + this.logger.flush(); + this.proxy.$update(this.id, OutputChannelUpdateMode.Append); + } } override dispose(): void { From a1946bd534229fa18a946257f71876e4297c28db Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 7 Nov 2022 17:57:22 +0100 Subject: [PATCH 162/185] fix #164881 (#165722) --- .../services/extensions/common/extensionsRegistry.ts | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/vs/workbench/services/extensions/common/extensionsRegistry.ts b/src/vs/workbench/services/extensions/common/extensionsRegistry.ts index f58e0c58463..be68971f7a3 100644 --- a/src/vs/workbench/services/extensions/common/extensionsRegistry.ts +++ b/src/vs/workbench/services/extensions/common/extensionsRegistry.ts @@ -319,11 +319,6 @@ export const schema: IJSONSchema = { body: 'onView:${5:viewId}', description: nls.localize('vscode.extension.activationEvents.onView', 'An activation event emitted whenever the specified view is expanded.'), }, - { - label: 'onIdentity', - body: 'onIdentity:${8:identity}', - description: nls.localize('vscode.extension.activationEvents.onIdentity', 'An activation event emitted whenever the specified user identity.'), - }, { label: 'onUri', body: 'onUri', From ddb025c9790cff64f39b89615143b8bf95b3316d Mon Sep 17 00:00:00 2001 From: Connor Peet Date: Mon, 7 Nov 2022 09:05:04 -0800 Subject: [PATCH 163/185] cli: fix install on windows arm64 not working Fixes #164573 --- cli/src/update_service.rs | 2 ++ cli/src/util/prereqs.rs | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/cli/src/update_service.rs b/cli/src/update_service.rs index 3c1456ecc59..9effa709840 100644 --- a/cli/src/update_service.rs +++ b/cli/src/update_service.rs @@ -300,6 +300,8 @@ impl Platform { Some(Platform::WindowsX64) } else if cfg!(all(target_os = "windows", target_arch = "x86")) { Some(Platform::WindowsX86) + } else if cfg!(all(target_os = "windows", target_arch = "aarch64")) { + Some(Platform::WindowsARM64) } else { None } diff --git a/cli/src/util/prereqs.rs b/cli/src/util/prereqs.rs index 86d5020efa1..dd240b412d8 100644 --- a/cli/src/util/prereqs.rs +++ b/cli/src/util/prereqs.rs @@ -39,7 +39,7 @@ impl PreReqChecker { #[cfg(not(target_os = "linux"))] pub async fn verify(&self) -> Result { Platform::env_default().ok_or_else(|| { - SetupError("VS Code it not supported on this platform".to_owned()).into() + SetupError("VS Code is not supported on this platform".to_owned()).into() }) } From 73416439d9d9cde7f54e727853a59ab89edd99ee Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Mon, 7 Nov 2022 10:25:16 -0800 Subject: [PATCH 164/185] fix default output font size (#165731) --- src/vs/workbench/contrib/notebook/common/notebookOptions.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/contrib/notebook/common/notebookOptions.ts b/src/vs/workbench/contrib/notebook/common/notebookOptions.ts index 2aa4ca14cf8..63661031729 100644 --- a/src/vs/workbench/contrib/notebook/common/notebookOptions.ts +++ b/src/vs/workbench/contrib/notebook/common/notebookOptions.ts @@ -141,7 +141,7 @@ export class NotebookOptions extends Disposable { const showFoldingControls = this._computeShowFoldingControlsOption(); // const { bottomToolbarGap, bottomToolbarHeight } = this._computeBottomToolbarDimensions(compactView, insertToolbarPosition, insertToolbarAlignment); const fontSize = this.configurationService.getValue('editor.fontSize'); - const outputFontSize = this.configurationService.getValue(NotebookSetting.outputFontSize); + const outputFontSize = this.configurationService.getValue(NotebookSetting.outputFontSize) || fontSize; const outputFontFamily = this.configurationService.getValue(NotebookSetting.outputFontFamily); const markupFontSize = this.configurationService.getValue(NotebookSetting.markupFontSize); const editorOptionsCustomizations = this.configurationService.getValue(NotebookSetting.cellEditorOptionsCustomizations); @@ -326,7 +326,7 @@ export class NotebookOptions extends Disposable { } if (outputFontSize) { - configuration.outputFontSize = this.configurationService.getValue(NotebookSetting.outputFontSize) ?? configuration.fontSize; + configuration.outputFontSize = this.configurationService.getValue(NotebookSetting.outputFontSize) || configuration.fontSize; } if (markupFontSize) { From 3983c597b34a2ec764d35615ab89256912cca47f Mon Sep 17 00:00:00 2001 From: Connor Peet Date: Mon, 7 Nov 2022 10:50:10 -0800 Subject: [PATCH 165/185] debug: bump js-debug Fixes #164592 --- product.json | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/product.json b/product.json index c76943372f1..db17ae76f1a 100644 --- a/product.json +++ b/product.json @@ -12,6 +12,16 @@ "serverApplicationName": "code-server-oss", "serverDataFolderName": ".vscode-server-oss", "tunnelApplicationName": "code-tunnel-oss", + "tunnelApplicationConfig": { + "authenticationProviders": { + "github": { + "scopes": [ + "user:email", + "read:org" + ] + } + } + }, "win32DirName": "Microsoft Code OSS", "win32NameVersion": "Microsoft Code OSS", "win32RegValueName": "CodeOSS", @@ -47,7 +57,7 @@ }, { "name": "ms-vscode.js-debug", - "version": "1.72.0", + "version": "1.72.1", "repo": "https://github.com/microsoft/vscode-js-debug", "metadata": { "id": "25629058-ddac-4e17-abba-74678e126c5d", From eb7c77c508c100c7041d6d20bc3ea73239bdde86 Mon Sep 17 00:00:00 2001 From: Connor Peet Date: Mon, 7 Nov 2022 11:07:23 -0800 Subject: [PATCH 166/185] cli: only build common platforms in ci Fixes #165140 --- build/azure-pipelines/product-build.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/build/azure-pipelines/product-build.yml b/build/azure-pipelines/product-build.yml index 14fad7182d7..2bc73858f7f 100644 --- a/build/azure-pipelines/product-build.yml +++ b/build/azure-pipelines/product-build.yml @@ -191,7 +191,7 @@ stages: VSCODE_BUILD_LINUX: ${{ parameters.VSCODE_BUILD_LINUX }} VSCODE_BUILD_LINUX_ALPINE: ${{ parameters.VSCODE_BUILD_LINUX_ALPINE }} - - ${{ if or(eq(parameters.VSCODE_BUILD_LINUX_ARMHF, true), eq(parameters.VSCODE_BUILD_LINUX_ARM64, true)) }}: + - ${{ if and(eq(variables['VSCODE_CIBUILD'], false), or(eq(parameters.VSCODE_BUILD_LINUX_ARMHF, true), eq(parameters.VSCODE_BUILD_LINUX_ARM64, true))) }}: - job: LinuxGnuARM pool: vscode-1es-linux steps: @@ -201,7 +201,7 @@ stages: VSCODE_BUILD_LINUX_ARMHF: ${{ parameters.VSCODE_BUILD_LINUX_ARMHF }} VSCODE_BUILD_LINUX_ARM64: ${{ parameters.VSCODE_BUILD_LINUX_ARM64 }} - - ${{ if eq(parameters.VSCODE_BUILD_LINUX_ALPINE_ARM64, true) }}: + - ${{ if and(eq(variables['VSCODE_CIBUILD'], false), eq(parameters.VSCODE_BUILD_LINUX_ALPINE_ARM64, true)) }}: - job: LinuxAlpineARM64 pool: vscode-1es-linux-20.04-arm64 steps: @@ -228,7 +228,7 @@ stages: VSCODE_QUALITY: ${{ variables.VSCODE_QUALITY }} VSCODE_BUILD_MACOS: ${{ parameters.VSCODE_BUILD_MACOS }} - - ${{ if eq(parameters.VSCODE_BUILD_MACOS_ARM64, true) }}: + - ${{ if and(eq(variables['VSCODE_CIBUILD'], false), eq(parameters.VSCODE_BUILD_MACOS_ARM64, true)) }}: - job: MacOSARM64 pool: vmImage: macOS-11 @@ -247,7 +247,7 @@ stages: VSCODE_QUALITY: ${{ variables.VSCODE_QUALITY }} VSCODE_BUILD_WIN32: ${{ parameters.VSCODE_BUILD_WIN32 }} - - ${{ if eq(parameters.VSCODE_BUILD_WIN32_ARM64, true) }}: + - ${{ if and(eq(variables['VSCODE_CIBUILD'], false), eq(parameters.VSCODE_BUILD_WIN32_ARM64, true)) }}: - job: WindowsARM64 pool: vscode-1es-windows steps: @@ -256,7 +256,7 @@ stages: VSCODE_QUALITY: ${{ variables.VSCODE_QUALITY }} VSCODE_BUILD_WIN32_ARM64: ${{ parameters.VSCODE_BUILD_WIN32_ARM64 }} - - ${{ if eq(parameters.VSCODE_BUILD_WIN32_32BIT, true) }}: + - ${{ if and(eq(variables['VSCODE_CIBUILD'], false), eq(parameters.VSCODE_BUILD_WIN32_32BIT, true)) }}: - job: WindowsX86 pool: vscode-1es-windows steps: From a1f9c6745a686aa741c60fde80ef359250fc6782 Mon Sep 17 00:00:00 2001 From: Raymond Zhao <7199958+rzhao271@users.noreply.github.com> Date: Mon, 7 Nov 2022 11:25:24 -0800 Subject: [PATCH 167/185] Refactor preferencesWidget to use CSS variables (#165736) * Refactor preferencesWidget, ref #165169 --- .../preferences/browser/media/preferences.css | 22 ++++++ .../preferences/browser/preferencesWidgets.ts | 74 +------------------ 2 files changed, 24 insertions(+), 72 deletions(-) diff --git a/src/vs/workbench/contrib/preferences/browser/media/preferences.css b/src/vs/workbench/contrib/preferences/browser/media/preferences.css index 96242340398..f1c876cc8f8 100644 --- a/src/vs/workbench/contrib/preferences/browser/media/preferences.css +++ b/src/vs/workbench/contrib/preferences/browser/media/preferences.css @@ -101,6 +101,28 @@ display: none; } +.settings-tabs-widget > .monaco-action-bar .action-item .action-label { + color: var(--vscode-panelTitle-inactiveForeground); +} + +.settings-tabs-widget > .monaco-action-bar .action-item .action-label.checked, +.settings-tabs-widget > .monaco-action-bar .action-item .action-label:hover { + color: var(--vscode-panelTitle-activeForeground); + border-bottom: 1px solid var(--vscode-panelTitle-activeBorder); + outline: 1px solid var(--vscode-contrastActiveBorder, transparent); + outline-offset: -1px; +} + +.settings-tabs-widget > .monaco-action-bar .action-item .action-label:focus { + border-bottom: 1px solid var(--vscode-focusBorder); + outline: 1px solid transparent; + outline-offset: -1px; +} + +.settings-tabs-widget > .monaco-action-bar .action-item .action-label:not(.checked):hover { + outline-style: dashed; +} + .preferences-header > .settings-header-widget { flex: 1; display: flex; diff --git a/src/vs/workbench/contrib/preferences/browser/preferencesWidgets.ts b/src/vs/workbench/contrib/preferences/browser/preferencesWidgets.ts index 0edfbe7a9b7..cab5ff5e1f1 100644 --- a/src/vs/workbench/contrib/preferences/browser/preferencesWidgets.ts +++ b/src/vs/workbench/contrib/preferences/browser/preferencesWidgets.ts @@ -28,11 +28,10 @@ import { IContextMenuService, IContextViewService } from 'vs/platform/contextvie import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { ILabelService } from 'vs/platform/label/common/label'; -import { activeContrastBorder, badgeBackground, badgeForeground, contrastBorder, focusBorder } from 'vs/platform/theme/common/colorRegistry'; +import { badgeBackground, badgeForeground, contrastBorder } from 'vs/platform/theme/common/colorRegistry'; import { attachInputBoxStyler, attachStylerCallback } from 'vs/platform/theme/common/styler'; -import { IColorTheme, ICssStyleCollector, IThemeService, registerThemingParticipant, ThemeIcon } from 'vs/platform/theme/common/themeService'; +import { IThemeService, ThemeIcon } from 'vs/platform/theme/common/themeService'; import { isWorkspaceFolder, IWorkspaceContextService, IWorkspaceFolder, WorkbenchState } from 'vs/platform/workspace/common/workspace'; -import { PANEL_ACTIVE_TITLE_BORDER, PANEL_ACTIVE_TITLE_FOREGROUND, PANEL_INACTIVE_TITLE_FOREGROUND } from 'vs/workbench/common/theme'; import { settingsEditIcon, settingsScopeDropDownIcon } from 'vs/workbench/contrib/preferences/browser/preferencesIcons'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { IPreferencesService } from 'vs/workbench/services/preferences/common/preferences'; @@ -575,72 +574,3 @@ export class EditPreferenceWidget extends Disposable { super.dispose(); } } - -registerThemingParticipant((theme: IColorTheme, collector: ICssStyleCollector) => { - - collector.addRule(` - .settings-tabs-widget > .monaco-action-bar .action-item .action-label:focus, - .settings-tabs-widget > .monaco-action-bar .action-item .action-label.checked { - border-bottom: 1px solid; - } - `); - // Title Active - const titleActive = theme.getColor(PANEL_ACTIVE_TITLE_FOREGROUND); - const titleActiveBorder = theme.getColor(PANEL_ACTIVE_TITLE_BORDER); - if (titleActive || titleActiveBorder) { - collector.addRule(` - .settings-tabs-widget > .monaco-action-bar .action-item .action-label:hover, - .settings-tabs-widget > .monaco-action-bar .action-item .action-label.checked { - color: ${titleActive}; - border-bottom-color: ${titleActiveBorder}; - } - `); - } - - // Title Inactive - const titleInactive = theme.getColor(PANEL_INACTIVE_TITLE_FOREGROUND); - if (titleInactive) { - collector.addRule(` - .settings-tabs-widget > .monaco-action-bar .action-item .action-label { - color: ${titleInactive}; - } - `); - } - - // Title focus - const focusBorderColor = theme.getColor(focusBorder); - if (focusBorderColor) { - collector.addRule(` - .settings-tabs-widget > .monaco-action-bar .action-item .action-label:focus { - border-bottom-color: ${focusBorderColor} !important; - } - `); - collector.addRule(` - .settings-tabs-widget > .monaco-action-bar .action-item .action-label:focus { - outline: none; - } - `); - } - - // Styling with Outline color (e.g. high contrast theme) - const outline = theme.getColor(activeContrastBorder); - if (outline) { - const outline = theme.getColor(activeContrastBorder); - - collector.addRule(` - .settings-tabs-widget > .monaco-action-bar .action-item .action-label.checked, - .settings-tabs-widget > .monaco-action-bar .action-item .action-label:hover { - outline-color: ${outline}; - outline-width: 1px; - outline-style: solid; - border-bottom: none; - padding-bottom: 0; - outline-offset: -1px; - } - - .settings-tabs-widget > .monaco-action-bar .action-item .action-label:not(.checked):hover { - outline-style: dashed; - } - `); - } -}); From cddd30c56f970337ce885a2916285e29435552ee Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Mon, 7 Nov 2022 11:43:32 -0800 Subject: [PATCH 168/185] Remove :root css variables in notebook find. (#165534) --- .../notebook/browser/contrib/find/notebookFindReplaceWidget.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/notebook/browser/contrib/find/notebookFindReplaceWidget.ts b/src/vs/workbench/contrib/notebook/browser/contrib/find/notebookFindReplaceWidget.ts index fff3b14beff..408d739ee69 100644 --- a/src/vs/workbench/contrib/notebook/browser/contrib/find/notebookFindReplaceWidget.ts +++ b/src/vs/workbench/contrib/notebook/browser/contrib/find/notebookFindReplaceWidget.ts @@ -765,7 +765,7 @@ export abstract class SimpleFindReplaceWidget extends Widget { // theming registerThemingParticipant((theme, collector) => { collector.addRule(` - :root { + .notebook-editor { --notebook-find-width: ${NOTEBOOK_FIND_WIDGET_INITIAL_WIDTH}px; --notebook-find-horizontal-padding: ${NOTEBOOK_FIND_WIDGET_INITIAL_HORIZONTAL_PADDING}px; } From ac05245aa83ed11cf02aa0a9779c8aa270c63179 Mon Sep 17 00:00:00 2001 From: Najmieh Sadat Date: Mon, 7 Nov 2022 23:18:21 +0330 Subject: [PATCH 169/185] Use CSS variables over registerThemingParticipant - minimap viewparts (#165465) * Replace Theme register participant with the CSS variables --- .../browser/viewParts/minimap/minimap.css | 17 ++++++++++++--- .../browser/viewParts/minimap/minimap.ts | 21 +------------------ 2 files changed, 15 insertions(+), 23 deletions(-) diff --git a/src/vs/editor/browser/viewParts/minimap/minimap.css b/src/vs/editor/browser/viewParts/minimap/minimap.css index f8c0b70f309..64ef4bc42fa 100644 --- a/src/vs/editor/browser/viewParts/minimap/minimap.css +++ b/src/vs/editor/browser/viewParts/minimap/minimap.css @@ -15,7 +15,18 @@ opacity: 1; } /* END cover the case that slider is visible on mouseover */ - +.monaco-editor .minimap-slider .minimap-slider-horizontal { + color: var(--vscode-minimapSlider-background); +} +.monaco-editor .minimap-slider:hover .minimap-slider-horizontal { + color: var(--vscode-minimapSlider-hoverBackground); +} +.monaco-editor .minimap-slider.active .minimap-slider-horizontal { + color: var(--vscode-minimapSlider-activeBackground); +} +.monaco-editor .minimap-shadow-visible { + box-shadow: var(--vscode-minimap-shadow) -6px 0 6px -6px inset; +} .monaco-editor .minimap-shadow-hidden { position: absolute; width: 0; @@ -33,9 +44,9 @@ /* 0.5s fade in/out for the minimap */ .minimap.autohide { - opacity: 0.0; + opacity: 0; transition: opacity 0.5s; } .minimap.autohide:hover { - opacity: 1.0; + opacity: 1; } diff --git a/src/vs/editor/browser/viewParts/minimap/minimap.ts b/src/vs/editor/browser/viewParts/minimap/minimap.ts index 12d68b9b527..19d9a42d8b6 100644 --- a/src/vs/editor/browser/viewParts/minimap/minimap.ts +++ b/src/vs/editor/browser/viewParts/minimap/minimap.ts @@ -27,8 +27,7 @@ import { ViewContext } from 'vs/editor/common/viewModel/viewContext'; import { EditorTheme } from 'vs/editor/common/editorTheme'; import * as viewEvents from 'vs/editor/common/viewEvents'; import { ViewLineData, ViewModelDecoration } from 'vs/editor/common/viewModel'; -import { minimapSelection, scrollbarShadow, minimapBackground, minimapSliderBackground, minimapSliderHoverBackground, minimapSliderActiveBackground, minimapForegroundOpacity } from 'vs/platform/theme/common/colorRegistry'; -import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; +import { minimapSelection, minimapBackground, minimapForegroundOpacity } from 'vs/platform/theme/common/colorRegistry'; import { ModelDecorationMinimapOptions } from 'vs/editor/common/model/textModel'; import { Selection } from 'vs/editor/common/core/selection'; import { Color } from 'vs/base/common/color'; @@ -2000,21 +1999,3 @@ class ContiguousLineMap { } } -registerThemingParticipant((theme, collector) => { - const sliderBackground = theme.getColor(minimapSliderBackground); - if (sliderBackground) { - collector.addRule(`.monaco-editor .minimap-slider .minimap-slider-horizontal { background: ${sliderBackground}; }`); - } - const sliderHoverBackground = theme.getColor(minimapSliderHoverBackground); - if (sliderHoverBackground) { - collector.addRule(`.monaco-editor .minimap-slider:hover .minimap-slider-horizontal { background: ${sliderHoverBackground}; }`); - } - const sliderActiveBackground = theme.getColor(minimapSliderActiveBackground); - if (sliderActiveBackground) { - collector.addRule(`.monaco-editor .minimap-slider.active .minimap-slider-horizontal { background: ${sliderActiveBackground}; }`); - } - const shadow = theme.getColor(scrollbarShadow); - if (shadow) { - collector.addRule(`.monaco-editor .minimap-shadow-visible { box-shadow: ${shadow} -6px 0 6px -6px inset; }`); - } -}); From 8a4de76117bfb4c64a5dc714ee676569f95ad6ab Mon Sep 17 00:00:00 2001 From: rebornix Date: Mon, 7 Nov 2022 12:33:32 -0800 Subject: [PATCH 170/185] :lipstick: --- .../notebook/browser/view/cellParts/codeCell.ts | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/vs/workbench/contrib/notebook/browser/view/cellParts/codeCell.ts b/src/vs/workbench/contrib/notebook/browser/view/cellParts/codeCell.ts index c8f786c707e..c68fa67586f 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/cellParts/codeCell.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/cellParts/codeCell.ts @@ -468,14 +468,12 @@ export class CodeCell extends Disposable { const viewLayout = this.templateData.editor.getLayoutInfo(); this.viewCell.editorHeight = newHeight; this.relayoutCell(); - DOM.scheduleAtNextAnimationFrame(() => { - this.layoutEditor( - { - width: viewLayout.width, - height: newHeight - } - ); - }); + this.layoutEditor( + { + width: viewLayout.width, + height: newHeight + } + ); } relayoutCell() { From 52804bf2f53f2a869abe2c7df3f21b5bc5179ac4 Mon Sep 17 00:00:00 2001 From: Connor Peet Date: Mon, 7 Nov 2022 13:17:35 -0800 Subject: [PATCH 171/185] cli: allow passing direct path to the vscode cli in --install-dir Fixes #164622 --- cli/src/desktop/version_manager.rs | 45 ++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/cli/src/desktop/version_manager.rs b/cli/src/desktop/version_manager.rs index 3fd1b7c35f3..4585ead10c6 100644 --- a/cli/src/desktop/version_manager.rs +++ b/cli/src/desktop/version_manager.rs @@ -138,6 +138,18 @@ impl CodeVersionManager { pub async fn get_entrypoint_for_install_dir(path: &Path) -> Option { use tokio::sync::mpsc; + // Check whether the user is supplying a path to the CLI directly (e.g. #164622) + if let Ok(true) = path.metadata().map(|m| m.is_file()) { + let result = std::process::Command::new(path) + .args(["--version"]) + .output() + .map(|o| o.status.success()); + + if let Ok(true) = result { + return Some(path.to_owned()); + } + } + let (tx, mut rx) = mpsc::channel(1); // Look for all the possible paths in parallel @@ -576,4 +588,37 @@ mod tests { .is_none() ); } + + #[tokio::test] + async fn test_gets_entrypoint_as_binary() { + let dir = tempfile::tempdir().expect("expected to make temp dir"); + + #[cfg(windows)] + let binary_file_path = { + let path = dir.path().join("code.cmd"); + File::create(&path).expect("expected to create file"); + path + }; + + #[cfg(unix)] + let binary_file_path = { + use std::fs; + use std::os::unix::fs::PermissionsExt; + + let path = dir.path().join("code"); + { + let mut f = File::create(&path).expect("expected to create file"); + f.write_all(b"#!/bin/sh") + .expect("expected to write to file"); + } + fs::set_permissions(&path, fs::Permissions::from_mode(0o777)) + .expect("expected to set permissions"); + path + }; + + assert_eq!( + CodeVersionManager::get_entrypoint_for_install_dir(&binary_file_path).await, + Some(binary_file_path) + ); + } } From 06a4015cda21d96fec9bf90c00112b404c22dbdf Mon Sep 17 00:00:00 2001 From: rebornix Date: Mon, 7 Nov 2022 13:32:44 -0800 Subject: [PATCH 172/185] resolve comments --- .../contrib/notebook/browser/view/cellPart.ts | 36 +++++++++++-------- .../browser/view/cellParts/codeCell.ts | 2 +- .../browser/view/renderers/cellRenderer.ts | 4 +++ 3 files changed, 27 insertions(+), 15 deletions(-) diff --git a/src/vs/workbench/contrib/notebook/browser/view/cellPart.ts b/src/vs/workbench/contrib/notebook/browser/view/cellPart.ts index 71e583dd9d8..dbd7380c69e 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/cellPart.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/cellPart.ts @@ -4,11 +4,15 @@ *--------------------------------------------------------------------------------------------*/ import * as DOM from 'vs/base/browser/dom'; -import { Disposable, DisposableStore, IDisposable } from 'vs/base/common/lifecycle'; +import { Disposable, DisposableStore, IDisposable, MutableDisposable } from 'vs/base/common/lifecycle'; import { ICellViewModel } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { CellViewModelStateChangeEvent } from 'vs/workbench/contrib/notebook/browser/notebookViewEvents'; import { ICellExecutionStateChangedEvent } from 'vs/workbench/contrib/notebook/common/notebookExecutionStateService'; +/** + * A content part is a non-floating element that is rendered inside a cell. + * The rendering of the content part is synchronous to avoid flickering. + */ export abstract class CellContentPart extends Disposable { protected currentCell: ICellViewModel | undefined; protected cellDisposables = new DisposableStore(); @@ -64,6 +68,10 @@ export abstract class CellContentPart extends Disposable { updateForExecutionState(element: ICellViewModel, e: ICellExecutionStateChangedEvent): void { } } +/** + * An overlay part renders on top of other components. + * The rendering of the overlay part might be postponed to the next animation frame to avoid forced reflow. + */ export abstract class CellOverlayPart extends Disposable { protected currentCell: ICellViewModel | undefined; protected cellDisposables = new DisposableStore(); @@ -114,10 +122,10 @@ export abstract class CellOverlayPart extends Disposable { updateForExecutionState(element: ICellViewModel, e: ICellExecutionStateChangedEvent): void { } } -export class CellPartsCollection { - private _scheduledOverlayRendering: IDisposable | undefined; - private _scheduledOverlayUpdateState: IDisposable | undefined; - private _scheduledOverlayUpdateExecutionState: IDisposable | undefined; +export class CellPartsCollection implements IDisposable { + private _scheduledOverlayRendering = new MutableDisposable(); + private _scheduledOverlayUpdateState = new MutableDisposable(); + private _scheduledOverlayUpdateExecutionState = new MutableDisposable(); constructor( private readonly contentParts: readonly CellContentPart[], @@ -147,10 +155,7 @@ export class CellPartsCollection { part.renderCell(element); } - // schedule overlay parts rendering - this._scheduledOverlayRendering?.dispose(); - - this._scheduledOverlayRendering = DOM.modify(() => { + this._scheduledOverlayRendering.value = DOM.modify(() => { for (const part of this.overlayParts) { part.renderCell(element); } @@ -188,9 +193,7 @@ export class CellPartsCollection { part.updateState(viewCell, e); } - this._scheduledOverlayUpdateState?.dispose(); - - this._scheduledOverlayUpdateState = DOM.modify(() => { + this._scheduledOverlayUpdateState.value = DOM.modify(() => { for (const part of this.overlayParts) { part.updateState(viewCell, e); } @@ -202,11 +205,16 @@ export class CellPartsCollection { part.updateForExecutionState(viewCell, e); } - this._scheduledOverlayUpdateExecutionState?.dispose(); - this._scheduledOverlayUpdateExecutionState = DOM.modify(() => { + this._scheduledOverlayUpdateExecutionState.value = DOM.modify(() => { for (const part of this.overlayParts) { part.updateForExecutionState(viewCell, e); } }); } + + dispose() { + this._scheduledOverlayRendering?.dispose(); + this._scheduledOverlayUpdateState?.dispose(); + this._scheduledOverlayUpdateExecutionState?.dispose(); + } } diff --git a/src/vs/workbench/contrib/notebook/browser/view/cellParts/codeCell.ts b/src/vs/workbench/contrib/notebook/browser/view/cellParts/codeCell.ts index c68fa67586f..8551a78b52f 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/cellParts/codeCell.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/cellParts/codeCell.ts @@ -55,7 +55,7 @@ export class CodeCell extends Disposable { const cellEditorOptions = this._register(new CellEditorOptions(this.notebookEditor.getBaseCellEditorOptions(viewCell.language), this.notebookEditor.notebookOptions, this.configurationService)); this._outputContainerRenderer = this.instantiationService.createInstance(CellOutputContainer, notebookEditor, viewCell, templateData, { limit: 500 }); - this.cellParts = templateData.cellParts.concatContentPart([cellEditorOptions, this._outputContainerRenderer]); + this.cellParts = this._register(templateData.cellParts.concatContentPart([cellEditorOptions, this._outputContainerRenderer])); const editorHeight = this.calculateInitEditorHeight(); this.initializeEditor(editorHeight); diff --git a/src/vs/workbench/contrib/notebook/browser/view/renderers/cellRenderer.ts b/src/vs/workbench/contrib/notebook/browser/view/renderers/cellRenderer.ts index 921e5795d2f..b9c83fc2b11 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/renderers/cellRenderer.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/renderers/cellRenderer.ts @@ -180,6 +180,8 @@ export class MarkupCellRenderer extends AbstractCellRenderer implements IListRen templateDisposables.add(scopedInstaService.createInstance(BetweenCellToolbar, this.notebookEditor, titleToolbarContainer, bottomCellContainer)) ]); + templateDisposables.add(cellParts); + const templateData: MarkdownCellRenderTemplate = { rootContainer, cellInputCollapsedContainer, @@ -324,6 +326,8 @@ export class CodeCellRenderer extends AbstractCellRenderer implements IListRende templateDisposables.add(scopedInstaService.createInstance(BetweenCellToolbar, this.notebookEditor, titleToolbarContainer, bottomCellToolbarContainer)) ]); + templateDisposables.add(cellParts); + const templateData: CodeCellRenderTemplate = { rootContainer, editorPart, From d7528c63f4c4f5e1cc845b45ac0a89946d924645 Mon Sep 17 00:00:00 2001 From: rebornix Date: Mon, 7 Nov 2022 13:39:12 -0800 Subject: [PATCH 173/185] do not dispose mutabledisposble too early --- .../contrib/notebook/browser/view/cellPart.ts | 24 ++++++++----------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/src/vs/workbench/contrib/notebook/browser/view/cellPart.ts b/src/vs/workbench/contrib/notebook/browser/view/cellPart.ts index dbd7380c69e..b16eeeb8f3c 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/cellPart.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/cellPart.ts @@ -122,15 +122,17 @@ export abstract class CellOverlayPart extends Disposable { updateForExecutionState(element: ICellViewModel, e: ICellExecutionStateChangedEvent): void { } } -export class CellPartsCollection implements IDisposable { - private _scheduledOverlayRendering = new MutableDisposable(); - private _scheduledOverlayUpdateState = new MutableDisposable(); - private _scheduledOverlayUpdateExecutionState = new MutableDisposable(); +export class CellPartsCollection extends Disposable { + private _scheduledOverlayRendering = this._register(new MutableDisposable()); + private _scheduledOverlayUpdateState = this._register(new MutableDisposable()); + private _scheduledOverlayUpdateExecutionState = this._register(new MutableDisposable()); constructor( private readonly contentParts: readonly CellContentPart[], private readonly overlayParts: readonly CellOverlayPart[] - ) { } + ) { + super(); + } concatContentPart(other: readonly CellContentPart[]): CellPartsCollection { return new CellPartsCollection(this.contentParts.concat(other), this.overlayParts); @@ -167,9 +169,9 @@ export class CellPartsCollection implements IDisposable { part.unrenderCell(element); } - this._scheduledOverlayRendering?.dispose(); - this._scheduledOverlayUpdateState?.dispose(); - this._scheduledOverlayUpdateExecutionState?.dispose(); + this._scheduledOverlayRendering.value = undefined; + this._scheduledOverlayUpdateState.value = undefined; + this._scheduledOverlayUpdateExecutionState.value = undefined; for (const part of this.overlayParts) { part.unrenderCell(element); @@ -211,10 +213,4 @@ export class CellPartsCollection implements IDisposable { } }); } - - dispose() { - this._scheduledOverlayRendering?.dispose(); - this._scheduledOverlayUpdateState?.dispose(); - this._scheduledOverlayUpdateExecutionState?.dispose(); - } } From e069cffd52b6fed75b6e7e9c17f22e73075d1d1a Mon Sep 17 00:00:00 2001 From: rebornix Date: Mon, 7 Nov 2022 13:48:14 -0800 Subject: [PATCH 174/185] :lipstick: --- src/vs/workbench/contrib/notebook/browser/view/cellPart.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/notebook/browser/view/cellPart.ts b/src/vs/workbench/contrib/notebook/browser/view/cellPart.ts index b16eeeb8f3c..ff99e716741 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/cellPart.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/cellPart.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as DOM from 'vs/base/browser/dom'; -import { Disposable, DisposableStore, IDisposable, MutableDisposable } from 'vs/base/common/lifecycle'; +import { Disposable, DisposableStore, MutableDisposable } from 'vs/base/common/lifecycle'; import { ICellViewModel } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { CellViewModelStateChangeEvent } from 'vs/workbench/contrib/notebook/browser/notebookViewEvents'; import { ICellExecutionStateChangedEvent } from 'vs/workbench/contrib/notebook/common/notebookExecutionStateService'; From 46caa3b4901bb89b91a7063b57ce394d99ce203f Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 7 Nov 2022 15:53:11 -0800 Subject: [PATCH 175/185] Exclude `@` from word pattern in js/ts (#165764) Fixes #162862 #148874 Still seems to be working too after this change --- extensions/javascript/javascript-language-configuration.json | 2 +- extensions/typescript-basics/language-configuration.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/javascript/javascript-language-configuration.json b/extensions/javascript/javascript-language-configuration.json index 72997cc3ecd..abfef6e8c4c 100644 --- a/extensions/javascript/javascript-language-configuration.json +++ b/extensions/javascript/javascript-language-configuration.json @@ -107,7 +107,7 @@ } }, "wordPattern": { - "pattern": "(-?\\d*\\.\\d\\w*)|([^\\`\\~\\!\\%\\^\\&\\*\\(\\)\\-\\=\\+\\[\\{\\]\\}\\\\\\|\\;\\:\\'\\\"\\,\\.\\<\\>/\\?\\s]+)", + "pattern": "(-?\\d*\\.\\d\\w*)|([^\\`\\~\\@\\!\\%\\^\\&\\*\\(\\)\\-\\=\\+\\[\\{\\]\\}\\\\\\|\\;\\:\\'\\\"\\,\\.\\<\\>/\\?\\s]+)", }, "indentationRules": { "decreaseIndentPattern": { diff --git a/extensions/typescript-basics/language-configuration.json b/extensions/typescript-basics/language-configuration.json index 739f085339e..e420bc3a995 100644 --- a/extensions/typescript-basics/language-configuration.json +++ b/extensions/typescript-basics/language-configuration.json @@ -125,7 +125,7 @@ } }, "wordPattern": { - "pattern": "(-?\\d*\\.\\d\\w*)|([^\\`\\~\\!\\%\\^\\&\\*\\(\\)\\-\\=\\+\\[\\{\\]\\}\\\\\\|\\;\\:\\'\\\"\\,\\.\\<\\>/\\?\\s]+)", + "pattern": "(-?\\d*\\.\\d\\w*)|([^\\`\\@\\~\\!\\%\\^\\&\\*\\(\\)\\-\\=\\+\\[\\{\\]\\}\\\\\\|\\;\\:\\'\\\"\\,\\.\\<\\>/\\?\\s]+)", }, "indentationRules": { "decreaseIndentPattern": { From 63fbcea804ef4fc9079701c859414d9a5c64983b Mon Sep 17 00:00:00 2001 From: Connor Peet Date: Mon, 7 Nov 2022 17:56:35 -0800 Subject: [PATCH 176/185] cli: pin rust (and clippy) version for builds --- build/azure-pipelines/cli/install-rust-posix.yml | 2 +- build/azure-pipelines/cli/install-rust-win32.yml | 2 +- build/azure-pipelines/cli/test.yml | 11 ----------- build/azure-pipelines/darwin/cli-build-darwin.yml | 3 --- build/azure-pipelines/linux/cli-build-linux.yml | 3 --- build/azure-pipelines/win32/cli-build-win32.yml | 3 --- 6 files changed, 2 insertions(+), 22 deletions(-) diff --git a/build/azure-pipelines/cli/install-rust-posix.yml b/build/azure-pipelines/cli/install-rust-posix.yml index e32a8eedadf..ee1e26f3505 100644 --- a/build/azure-pipelines/cli/install-rust-posix.yml +++ b/build/azure-pipelines/cli/install-rust-posix.yml @@ -1,7 +1,7 @@ parameters: - name: channel type: string - default: stable + default: 1.65.0 - name: targets default: [] type: object diff --git a/build/azure-pipelines/cli/install-rust-win32.yml b/build/azure-pipelines/cli/install-rust-win32.yml index a1a250dcfbf..62ff0ce4ec5 100644 --- a/build/azure-pipelines/cli/install-rust-win32.yml +++ b/build/azure-pipelines/cli/install-rust-win32.yml @@ -1,7 +1,7 @@ parameters: - name: channel type: string - default: stable + default: 1.65.0 - name: targets default: [] type: object diff --git a/build/azure-pipelines/cli/test.yml b/build/azure-pipelines/cli/test.yml index 70eb714c1d9..24ab9682bfe 100644 --- a/build/azure-pipelines/cli/test.yml +++ b/build/azure-pipelines/cli/test.yml @@ -1,16 +1,5 @@ -parameters: - - name: VSCODE_CLI_TARGETS - default: [] - type: object - - name: VSCODE_CLI_RUST_CHANNEL - type: string - default: stable - steps: - template: ./install-rust-posix.yml - parameters: - targets: [] - channel: ${{ parameters.VSCODE_CLI_RUST_CHANNEL }} - script: rustup component add clippy && cargo clippy -- -D warnings workingDirectory: cli diff --git a/build/azure-pipelines/darwin/cli-build-darwin.yml b/build/azure-pipelines/darwin/cli-build-darwin.yml index 90e15d1c9e1..1f6e13997e3 100644 --- a/build/azure-pipelines/darwin/cli-build-darwin.yml +++ b/build/azure-pipelines/darwin/cli-build-darwin.yml @@ -7,9 +7,6 @@ parameters: - name: VSCODE_BUILD_MACOS_ARM64 type: boolean default: false - - name: channel - type: string - default: stable steps: - task: Npm@1 diff --git a/build/azure-pipelines/linux/cli-build-linux.yml b/build/azure-pipelines/linux/cli-build-linux.yml index b7b10504b4d..799c00b93c9 100644 --- a/build/azure-pipelines/linux/cli-build-linux.yml +++ b/build/azure-pipelines/linux/cli-build-linux.yml @@ -16,9 +16,6 @@ parameters: default: false - name: VSCODE_QUALITY type: string - - name: channel - type: string - default: stable steps: - task: Npm@1 diff --git a/build/azure-pipelines/win32/cli-build-win32.yml b/build/azure-pipelines/win32/cli-build-win32.yml index d581591730a..928d3c00e82 100644 --- a/build/azure-pipelines/win32/cli-build-win32.yml +++ b/build/azure-pipelines/win32/cli-build-win32.yml @@ -10,9 +10,6 @@ parameters: default: false - name: VSCODE_QUALITY type: string - - name: channel - type: string - default: stable steps: - task: Npm@1 From af05f1713ee9451905bc175632d9f9576cab0d2f Mon Sep 17 00:00:00 2001 From: rebornix Date: Mon, 7 Nov 2022 19:23:12 -0800 Subject: [PATCH 177/185] Track overlay part disposable --- src/vs/workbench/contrib/notebook/browser/view/cellPart.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/notebook/browser/view/cellPart.ts b/src/vs/workbench/contrib/notebook/browser/view/cellPart.ts index ff99e716741..0f0fcff7f35 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/cellPart.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/cellPart.ts @@ -74,7 +74,7 @@ export abstract class CellContentPart extends Disposable { */ export abstract class CellOverlayPart extends Disposable { protected currentCell: ICellViewModel | undefined; - protected cellDisposables = new DisposableStore(); + protected readonly cellDisposables = this._register(new DisposableStore()); constructor() { super(); From a8ae2cedaf2cee27b6e68bcc219e236d3276cd3b Mon Sep 17 00:00:00 2001 From: Tyler James Leonhardt Date: Mon, 7 Nov 2022 19:50:39 -0800 Subject: [PATCH 178/185] Include JS files in XLF creation for extensions (#165774) * Bumps @vscode/l10n-dev to a version that supports JS files * Pulls in JS files (and TSX & JSX) in addition to TS to account for scenarios like Emmet which pulls in @vscode/emmet-helper as an npm package --- build/lib/i18n.js | 14 ++++++++++---- build/lib/i18n.ts | 14 ++++++++++---- package.json | 4 ++-- yarn.lock | 8 ++++---- 4 files changed, 26 insertions(+), 14 deletions(-) diff --git a/build/lib/i18n.js b/build/lib/i18n.js index 61ffa3b9261..dcb3b7ddb30 100644 --- a/build/lib/i18n.js +++ b/build/lib/i18n.js @@ -510,15 +510,21 @@ exports.createXlfFilesForCoreBundle = createXlfFilesForCoreBundle; function createL10nBundleForExtension(extensionFolderName) { const result = (0, event_stream_1.through)(); gulp.src([ - `extensions/${extensionFolderName}/src/**/*.ts`, + // For source code of extensions + `extensions/${extensionFolderName}/src/**/*.{ts,tsx}`, + // For any dependencies pulled in (think vscode-css-languageservice or @vscode/emmet-helper) + `extensions/${extensionFolderName}/node_modules/**/*.{js,jsx}` ]).pipe((0, event_stream_1.writeArray)((err, files) => { if (err) { result.emit('error', err); return; } - const json = (0, l10n_dev_1.getL10nJson)(files.map(file => { - return file.contents.toString('utf8'); - })); + const json = (0, l10n_dev_1.getL10nJson)(files + .filter(file => file.isBuffer()) + .map(file => ({ + contents: file.contents.toString('utf8'), + extension: path.extname(file.path) + }))); if (Object.keys(json).length > 0) { result.emit('data', new File({ path: `extensions/${extensionFolderName}/bundle.l10n.json`, diff --git a/build/lib/i18n.ts b/build/lib/i18n.ts index 4687f97b46d..58cce082343 100644 --- a/build/lib/i18n.ts +++ b/build/lib/i18n.ts @@ -582,16 +582,22 @@ export function createXlfFilesForCoreBundle(): ThroughStream { function createL10nBundleForExtension(extensionFolderName: string): ThroughStream { const result = through(); gulp.src([ - `extensions/${extensionFolderName}/src/**/*.ts`, + // For source code of extensions + `extensions/${extensionFolderName}/src/**/*.{ts,tsx}`, + // For any dependencies pulled in (think vscode-css-languageservice or @vscode/emmet-helper) + `extensions/${extensionFolderName}/node_modules/**/*.{js,jsx}` ]).pipe(writeArray((err, files: File[]) => { if (err) { result.emit('error', err); return; } - const json = getL10nJson(files.map(file => { - return file.contents.toString('utf8'); - })); + const json = getL10nJson(files + .filter(file => file.isBuffer()) + .map(file => ({ + contents: file.contents.toString('utf8'), + extension: path.extname(file.path) + }))); if (Object.keys(json).length > 0) { result.emit('data', new File({ diff --git a/package.json b/package.json index 397217912f3..75588e088bb 100644 --- a/package.json +++ b/package.json @@ -128,7 +128,7 @@ "@typescript-eslint/eslint-plugin": "^5.39.0", "@typescript-eslint/experimental-utils": "^5.39.0", "@typescript-eslint/parser": "^5.39.0", - "@vscode/l10n-dev": "0.0.15", + "@vscode/l10n-dev": "0.0.18", "@vscode/telemetry-extractor": "^1.9.8", "@vscode/test-web": "^0.0.32", "ansi-colors": "^3.2.3", @@ -237,4 +237,4 @@ "elliptic": "^6.5.3", "nwmatcher": "^1.4.4" } -} \ No newline at end of file +} diff --git a/yarn.lock b/yarn.lock index 19a83624cc3..b1abee8ffea 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1252,10 +1252,10 @@ resolved "https://registry.yarnpkg.com/@vscode/iconv-lite-umd/-/iconv-lite-umd-0.7.0.tgz#d2f1e0664ee6036408f9743fee264ea0699b0e48" integrity sha512-bRRFxLfg5dtAyl5XyiVWz/ZBPahpOpPrNYnnHpOpUZvam4tKH35wdhP4Kj6PbM0+KdliOsPzbGWpkxcdpNB/sg== -"@vscode/l10n-dev@0.0.15": - version "0.0.15" - resolved "https://registry.yarnpkg.com/@vscode/l10n-dev/-/l10n-dev-0.0.15.tgz#677b527987ccd39e32c50956f139736a788061d6" - integrity sha512-zLuo/pa+FtnFrVq/7M8VHshgejNZ6TvnRW9/um1pLkg92PZ9glDgmwXUv1AdpBu5KNzgH9odiMKS4YQDkS12wQ== +"@vscode/l10n-dev@0.0.18": + version "0.0.18" + resolved "https://registry.yarnpkg.com/@vscode/l10n-dev/-/l10n-dev-0.0.18.tgz#80a8cf6ef13c7fe1796be7b0007d71993bd1832f" + integrity sha512-pEKLMnlg7hlxFrZLqcyJe08olmj6KVs2Rof7MVB5rN0D6NOKPBRtkQ176TuMUmW863EDV5WQUgNzOGa2nHBSSQ== dependencies: deepmerge-json "^1.5.0" glob "^8.0.3" From 5d04c3b06c6b7d6465770b7a35163b37fbdb6044 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 7 Nov 2022 20:24:31 -0800 Subject: [PATCH 179/185] Don't assume file paths in tsconfigs (#165779) Fixes #160979 --- .../src/languageFeatures/tsconfig.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/extensions/typescript-language-features/src/languageFeatures/tsconfig.ts b/extensions/typescript-language-features/src/languageFeatures/tsconfig.ts index 13105e88629..1bc20abd55b 100644 --- a/extensions/typescript-language-features/src/languageFeatures/tsconfig.ts +++ b/extensions/typescript-language-features/src/languageFeatures/tsconfig.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as jsonc from 'jsonc-parser'; -import { basename, dirname, join, posix } from 'path'; +import { basename, posix } from 'path'; import * as vscode from 'vscode'; import { Utils } from 'vscode-uri'; import { coalesce } from '../utils/arrays'; @@ -103,11 +103,11 @@ class TsconfigLinkProvider implements vscode.DocumentLinkProvider { } private getFileTarget(document: vscode.TextDocument, node: jsonc.Node): vscode.Uri { - return vscode.Uri.file(join(dirname(document.uri.fsPath), node.value)); + return vscode.Uri.joinPath(Utils.dirname(document.uri), node.value); } private getFolderTarget(document: vscode.TextDocument, node: jsonc.Node): vscode.Uri { - return vscode.Uri.file(join(dirname(document.uri.fsPath), node.value, 'tsconfig.json')); + return vscode.Uri.joinPath(Utils.dirname(document.uri), node.value, 'tsconfig.json'); } private getRange(document: vscode.TextDocument, node: jsonc.Node) { From 2282be522a8031209a739783baede67bfa9fc95a Mon Sep 17 00:00:00 2001 From: Joyce Er Date: Mon, 7 Nov 2022 20:56:53 -0800 Subject: [PATCH 180/185] Fix edit session partial matches (#165782) --- extensions/git/src/editSessionIdentityProvider.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/extensions/git/src/editSessionIdentityProvider.ts b/extensions/git/src/editSessionIdentityProvider.ts index eb753d69865..5227741c422 100644 --- a/extensions/git/src/editSessionIdentityProvider.ts +++ b/extensions/git/src/editSessionIdentityProvider.ts @@ -46,7 +46,9 @@ export class GitEditSessionIdentityProvider implements vscode.EditSessionIdentit normalizedIdentity1.sha === normalizedIdentity2.sha) { // This is a perfect match return vscode.EditSessionIdentityMatch.Complete; - } else if (normalizedIdentity1.sha !== normalizedIdentity2.sha) { + } else if (normalizedIdentity1.remote === normalizedIdentity2.remote && + normalizedIdentity1.ref === normalizedIdentity2.ref && + normalizedIdentity1.sha !== normalizedIdentity2.sha) { // Same branch and remote but different SHA return vscode.EditSessionIdentityMatch.Partial; } else { From 283aa61a5889425934405f924b63b9a1f0aac2f3 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 7 Nov 2022 21:07:33 -0800 Subject: [PATCH 181/185] Enable autoplay in webviews (#165784) For #134514 This PR allows autoplaying of audio/videos in webviews. However it disables autoplaying of non-muted audio/video without user interaction by setting `autoplayPolicy` in electron. Browsers automatically follow the same behavior --- src/vs/base/browser/markdownRenderer.ts | 1 + src/vs/platform/windows/electron-main/windowImpl.ts | 1 + .../contrib/webview/browser/pre/index-no-csp.html | 2 +- src/vs/workbench/contrib/webview/browser/pre/index.html | 4 ++-- src/vs/workbench/contrib/webview/browser/webviewElement.ts | 7 +++---- 5 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/vs/base/browser/markdownRenderer.ts b/src/vs/base/browser/markdownRenderer.ts index 825ab6e6984..e4b9dcf4ecd 100644 --- a/src/vs/base/browser/markdownRenderer.ts +++ b/src/vs/base/browser/markdownRenderer.ts @@ -360,6 +360,7 @@ function sanitizeRenderedMarkdown( export const allowedMarkdownAttr = [ 'align', + 'autoplay', 'alt', 'class', 'controls', diff --git a/src/vs/platform/windows/electron-main/windowImpl.ts b/src/vs/platform/windows/electron-main/windowImpl.ts index 91f45e88bfd..25eb72719b2 100644 --- a/src/vs/platform/windows/electron-main/windowImpl.ts +++ b/src/vs/platform/windows/electron-main/windowImpl.ts @@ -221,6 +221,7 @@ export class CodeWindow extends Disposable implements ICodeWindow { enableWebSQL: false, spellcheck: false, zoomFactor: zoomLevelToZoomFactor(windowSettings?.zoomLevel), + autoplayPolicy: 'user-gesture-required', // Enable experimental css highlight api https://chromestatus.com/feature/5436441440026624 // Refs https://github.com/microsoft/vscode/issues/140098 enableBlinkFeatures: 'HighlightAPI', diff --git a/src/vs/workbench/contrib/webview/browser/pre/index-no-csp.html b/src/vs/workbench/contrib/webview/browser/pre/index-no-csp.html index cf948d880c3..4d303e16840 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/index-no-csp.html +++ b/src/vs/workbench/contrib/webview/browser/pre/index-no-csp.html @@ -956,7 +956,7 @@ } newFrame.setAttribute('sandbox', Array.from(sandboxRules).join(' ')); - const allowRules = ['cross-origin-isolated;']; + const allowRules = ['cross-origin-isolated;', 'autoplay']; if (!isFirefox && options.allowScripts) { allowRules.push('clipboard-read;', 'clipboard-write;'); } diff --git a/src/vs/workbench/contrib/webview/browser/pre/index.html b/src/vs/workbench/contrib/webview/browser/pre/index.html index fdedff6fdfd..bb12c8f6379 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/index.html +++ b/src/vs/workbench/contrib/webview/browser/pre/index.html @@ -5,7 +5,7 @@ + content="default-src 'none'; script-src 'sha256-6s2fEapj0jmA7ZDjzz23Uv4xLlM7KX3p9DYidJX7Zmk=' 'self'; frame-src 'self'; style-src 'unsafe-inline';"> Date: Mon, 7 Nov 2022 21:14:44 -0800 Subject: [PATCH 182/185] Polish Settings editor styling (#165767) * Remove .mid-width class * Polish settings tabs widget border alignment --- .../browser/media/settingsEditor2.css | 19 ++++--------------- .../preferences/browser/settingsEditor2.ts | 4 +--- 2 files changed, 5 insertions(+), 18 deletions(-) diff --git a/src/vs/workbench/contrib/preferences/browser/media/settingsEditor2.css b/src/vs/workbench/contrib/preferences/browser/media/settingsEditor2.css index b7a87ddd56e..ba7b7c0b9d4 100644 --- a/src/vs/workbench/contrib/preferences/browser/media/settingsEditor2.css +++ b/src/vs/workbench/contrib/preferences/browser/media/settingsEditor2.css @@ -95,6 +95,8 @@ .settings-editor > .settings-header > .settings-header-controls .settings-tabs-widget .action-label.checked { opacity: 1; color: var(--vscode-settings-headerForeground); +} +.settings-editor > .settings-header > .settings-header-controls .settings-tabs-widget .action-label.checked:not(:focus) { border-bottom-color: var(--vscode-settings-headerForeground); } @@ -112,10 +114,6 @@ /* padding must be on action-label because it has the bottom-border, because that's where the .checked class is */ } -.settings-editor > .settings-header > .settings-header-controls .settings-tabs-widget > .monaco-action-bar .action-item.focused { - outline-offset: -1.5px; -} - .settings-editor > .settings-header > .settings-header-controls .settings-tabs-widget > .monaco-action-bar .action-item .action-label { text-transform: none; font-size: 13px; @@ -130,8 +128,8 @@ } .settings-editor > .settings-header > .settings-header-controls .settings-tabs-widget > .monaco-action-bar .action-item .action-label:not(.checked):not(:focus) { - /* Add an extra pixel due to it not getting the outline */ - padding-bottom: 8px; + /* Still maintain a border for alignment, but keep it transparent */ + border-bottom: 1px solid transparent; } .settings-editor > .settings-body { @@ -202,15 +200,6 @@ outline: 1px solid var(--vscode-settings-focusedRowBorder); } -.settings-editor.mid-width > .settings-body .settings-tree-container .settings-editor-tree > .monaco-scrollable-element > .shadow.top { - left: 0; - width: calc(100% - 48px); - margin-left: 24px; -} -.settings-editor.mid-width > .settings-body .settings-tree-container .settings-editor-tree > .monaco-scrollable-element > .shadow.top.top-left-corner { - width: 24px; - margin-left: 0px; -} .settings-editor > .settings-body .settings-tree-container .settings-editor-tree > .monaco-scrollable-element > .shadow.top { z-index: 11; } diff --git a/src/vs/workbench/contrib/preferences/browser/settingsEditor2.ts b/src/vs/workbench/contrib/preferences/browser/settingsEditor2.ts index f12a3672b7b..12760e0c0eb 100644 --- a/src/vs/workbench/contrib/preferences/browser/settingsEditor2.ts +++ b/src/vs/workbench/contrib/preferences/browser/settingsEditor2.ts @@ -104,7 +104,6 @@ export class SettingsEditor2 extends EditorPane { private static EDITOR_MIN_WIDTH: number = 500; // Below NARROW_TOTAL_WIDTH, we only render the editor rather than the ToC. private static NARROW_TOTAL_WIDTH: number = SettingsEditor2.TOC_RESET_WIDTH + SettingsEditor2.EDITOR_MIN_WIDTH; - private static MEDIUM_TOTAL_WIDTH: number = 1000; private static SUGGESTIONS: string[] = [ `@${MODIFIED_SETTING_TAG}`, @@ -442,7 +441,6 @@ export class SettingsEditor2 extends EditorPane { const monacoWidth = innerWidth - 10 - this.countElement.clientWidth - this.controlsElement.clientWidth - 12; this.searchWidget.layout(new DOM.Dimension(monacoWidth, 20)); - this.rootElement.classList.toggle('mid-width', dimension.width < SettingsEditor2.MEDIUM_TOTAL_WIDTH && dimension.width >= SettingsEditor2.NARROW_TOTAL_WIDTH); this.rootElement.classList.toggle('narrow-width', dimension.width < SettingsEditor2.NARROW_TOTAL_WIDTH); } @@ -1675,7 +1673,7 @@ export class SettingsEditor2 extends EditorPane { this.splitView.resizeView(0, SettingsEditor2.TOC_RESET_WIDTH); } this.splitView.style({ - separatorBorder: firstViewVisible ? this.theme.getColor(settingsSashBorder) ?? Color.transparent : Color.transparent + separatorBorder: firstViewVisible ? this.theme.getColor(settingsSashBorder)! : Color.transparent }); } From c0e7b29b4c7d1f69f29af27ffc56d0d1845f7c2b Mon Sep 17 00:00:00 2001 From: Joyce Er Date: Mon, 7 Nov 2022 21:53:13 -0800 Subject: [PATCH 183/185] Ask for Continue On selection before auth (#165734) --- .../browser/editSessions.contribution.ts | 28 +++++++++++-------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/src/vs/workbench/contrib/editSessions/browser/editSessions.contribution.ts b/src/vs/workbench/contrib/editSessions/browser/editSessions.contribution.ts index 7f5a295c1a9..38bfa0c565b 100644 --- a/src/vs/workbench/contrib/editSessions/browser/editSessions.contribution.ts +++ b/src/vs/workbench/contrib/editSessions/browser/editSessions.contribution.ts @@ -292,6 +292,17 @@ export class EditSessionsContribution extends Disposable implements IWorkbenchCo }; that.telemetryService.publicLog2('editSessions.continue.store'); + // First ask the user to pick a destination, if necessary + let uri: URI | 'noDestinationUri' | undefined = workspaceUri; + let destination; + if (!uri) { + destination = await that.pickContinueEditSessionDestination(); + } + if (!destination && !uri) { + return; + } + + // Determine if we need to store an edit session, asking for edit session auth if necessary const shouldStoreEditSession = await that.shouldContinueOnWithEditSession(); // Run the store action to get back a ref @@ -304,17 +315,12 @@ export class EditSessionsContribution extends Disposable implements IWorkbenchCo }, async () => that.storeEditSession(false)); } - let uri = workspaceUri ?? await that.pickContinueEditSessionDestination(); + // Append the ref to the URI + uri = destination ? await that.resolveDestination(destination) : uri; if (uri === undefined) { - // If the user didn't end up picking a Continue On destination - // and we stored an edit session, clean up the stored edit session - if (ref !== undefined) { - void that.editSessionsStorageService.delete(ref); - } return; } - // Append the ref to the URI if (ref !== undefined && uri !== 'noDestinationUri') { const encodedRef = encodeURIComponent(ref); uri = uri.with({ @@ -746,7 +752,7 @@ export class EditSessionsContribution extends Disposable implements IWorkbenchCo })); } - private async pickContinueEditSessionDestination(): Promise { + private async pickContinueEditSessionDestination(): Promise { const quickPick = this.quickInputService.createQuickPick(); const workspaceContext = this.contextService.getWorkbenchState() === WorkbenchState.FOLDER @@ -769,10 +775,10 @@ export class EditSessionsContribution extends Disposable implements IWorkbenchCo quickPick.dispose(); - if (command === undefined) { - return undefined; - } + return command; + } + private async resolveDestination(command: string): Promise { try { const uri = await this.commandService.executeCommand(command); From 391235a7e97e040ef0ad4e5cc42289447408d3d9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Nov 2022 21:59:09 -0800 Subject: [PATCH 184/185] Bump loader-utils from 1.4.0 to 1.4.1 (#165770) --- yarn.lock | 27 ++++++++++----------------- 1 file changed, 10 insertions(+), 17 deletions(-) diff --git a/yarn.lock b/yarn.lock index b1abee8ffea..bf70a913cc3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6649,14 +6649,7 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" -json5@^2.1.2: - version "2.1.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" - integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== - dependencies: - minimist "^1.2.5" - -json5@^2.2.1: +json5@^2.1.2, json5@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== @@ -6916,9 +6909,9 @@ loader-runner@^4.2.0: integrity sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw== loader-utils@^1.2.3, loader-utils@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" - integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== + version "1.4.1" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.1.tgz#278ad7006660bccc4d2c0c1578e17c5c78d5c0e0" + integrity sha512-1Qo97Y2oKaU+Ro2xnDMR26g1BwMT29jNbem1EvcujW2jqt+j5COXyscjM7bLQkM9HaxI7pkWeW7gnI072yMI9Q== dependencies: big.js "^5.2.2" emojis-list "^3.0.0" @@ -7381,16 +7374,16 @@ minimatch@^5.0.1, minimatch@^5.1.0: dependencies: brace-expansion "^2.0.1" -minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5, minimist@^1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" - integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== - -minimist@^1.2.7: +minimist@^1.2.0, minimist@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== +minimist@^1.2.3, minimist@^1.2.5, minimist@^1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" + integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== + minipass-collect@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" From ed1bc56bd8b6343296ba8310167928e1e955a74e Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 8 Nov 2022 12:01:57 +0100 Subject: [PATCH 185/185] prefix argument id with actual command (#165805) https://github.com/microsoft/vscode/issues/165244#issuecomment-1306889823 --- .../contrib/codeAction/test/browser/codeAction.test.ts | 4 ++-- src/vs/workbench/api/common/extHost.protocol.ts | 4 ++-- src/vs/workbench/api/common/extHostCommands.ts | 8 ++++---- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/vs/editor/contrib/codeAction/test/browser/codeAction.test.ts b/src/vs/editor/contrib/codeAction/test/browser/codeAction.test.ts index 5c955710497..09699fd6d12 100644 --- a/src/vs/editor/contrib/codeAction/test/browser/codeAction.test.ts +++ b/src/vs/editor/contrib/codeAction/test/browser/codeAction.test.ts @@ -80,13 +80,13 @@ suite('CodeAction', () => { }, tsLint: { abc: { - $ident: 57, + $ident: 'funny' + 57, arguments: [], id: '_internal_command_delegation', title: 'abc' }, bcd: { - $ident: 47, + $ident: 'funny' + 47, arguments: [], id: '_internal_command_delegation', title: 'bcd' diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index 8236cc0a471..b1cb83364df 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -1566,7 +1566,7 @@ export interface ISuggestDataDto { [ISuggestDataDtoField.additionalTextEdits]?: ISingleEditOperation[]; [ISuggestDataDtoField.kindModifier]?: languages.CompletionItemTag[]; // Command - [ISuggestDataDtoField.commandIdent]?: number; + [ISuggestDataDtoField.commandIdent]?: string; [ISuggestDataDtoField.commandId]?: string; [ISuggestDataDtoField.commandArguments]?: any[]; // not-standard @@ -1640,7 +1640,7 @@ export interface IWorkspaceEditDto { edits: Array; } -export type ICommandDto = { $ident?: number } & languages.Command; +export type ICommandDto = { $ident?: string } & languages.Command; export interface ICodeActionDto { cacheId?: ChainedCacheId; diff --git a/src/vs/workbench/api/common/extHostCommands.ts b/src/vs/workbench/api/common/extHostCommands.ts index 154d9607588..644e37192c5 100644 --- a/src/vs/workbench/api/common/extHostCommands.ts +++ b/src/vs/workbench/api/common/extHostCommands.ts @@ -323,7 +323,7 @@ export const IExtHostCommands = createDecorator('IExtHostComma export class CommandsConverter implements extHostTypeConverter.Command.ICommandsConverter { readonly delegatingCommandId: string = `__vsc${Date.now().toString(36)}`; - private readonly _cache = new Map(); + private readonly _cache = new Map(); private _cachIdPool = 0; // --- conversion between internal and api commands @@ -367,7 +367,7 @@ export class CommandsConverter implements extHostTypeConverter.Command.ICommands // we have a contributed command with arguments. that // means we don't want to send the arguments around - const id = ++this._cachIdPool; + const id = `${command.command}/${++this._cachIdPool}`; this._cache.set(id, command); disposables.add(toDisposable(() => { this._cache.delete(id); @@ -386,7 +386,7 @@ export class CommandsConverter implements extHostTypeConverter.Command.ICommands fromInternal(command: ICommandDto): vscode.Command | undefined { - if (typeof command.$ident === 'number') { + if (typeof command.$ident === 'string') { return this._cache.get(command.$ident); } else { @@ -408,7 +408,7 @@ export class CommandsConverter implements extHostTypeConverter.Command.ICommands this._logService.trace('CommandsConverter#EXECUTE', args[0], actualCmd ? actualCmd.command : 'MISSING'); if (!actualCmd) { - return Promise.reject('actual command NOT FOUND'); + return Promise.reject(`Actual command not found, wanted to execute ${args[0]}`); } return this._commands.executeCommand(actualCmd.command, ...(actualCmd.arguments || [])); }