From 1e0580ec231c33f4867bb4b00694121e64f20052 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Sun, 14 Jan 2024 22:49:29 +0530 Subject: [PATCH] Use categories for builtin extensions groups (#202453) * support grouping of extensions * remove grouping * reuse categories parsing * cleanup * fix tests --- extensions/bat/package.json | 1 + extensions/clojure/package.json | 1 + extensions/coffeescript/package.json | 1 + extensions/cpp/package.json | 1 + extensions/csharp/package.json | 1 + extensions/css/package.json | 1 + extensions/dart/package.json | 15 +- extensions/diff/package.json | 1 + extensions/docker/package.json | 1 + extensions/fsharp/package.json | 1 + extensions/go/package.json | 1 + extensions/groovy/package.json | 1 + extensions/handlebars/package.json | 1 + extensions/hlsl/package.json | 1 + extensions/html/package.json | 1 + extensions/ini/package.json | 1 + extensions/java/package.json | 1 + extensions/javascript/package.json | 1 + extensions/json/package.json | 1 + extensions/julia/package.json | 1 + extensions/latex/package.json | 1 + extensions/less/package.json | 1 + extensions/log/package.json | 1 + extensions/lua/package.json | 1 + extensions/make/package.json | 1 + extensions/markdown-basics/package.json | 1 + extensions/markdown-math/package.json | 3 +- extensions/objective-c/package.json | 1 + extensions/perl/package.json | 1 + extensions/php/package.json | 1 + extensions/powershell/package.json | 1 + extensions/pug/package.json | 1 + extensions/python/package.json | 1 + extensions/r/package.json | 1 + extensions/razor/package.json | 1 + extensions/references-view/package.json | 3 - extensions/restructuredtext/package.json | 1 + extensions/ruby/package.json | 1 + extensions/rust/package.json | 1 + extensions/scss/package.json | 1 + extensions/search-result/package.json | 3 - extensions/shaderlab/package.json | 1 + extensions/shellscript/package.json | 1 + extensions/sql/package.json | 1 + extensions/swift/package.json | 1 + extensions/theme-abyss/package.json | 1 + extensions/theme-kimbie-dark/package.json | 1 + extensions/theme-monokai-dimmed/package.json | 1 + extensions/theme-monokai/package.json | 1 + extensions/theme-quietlight/package.json | 1 + extensions/theme-red/package.json | 1 + extensions/theme-seti/package.json | 1 + extensions/theme-solarized-dark/package.json | 1 + extensions/theme-solarized-light/package.json | 1 + .../theme-tomorrow-night-blue/package.json | 1 + extensions/typescript-basics/package.json | 1 + extensions/vb/package.json | 1 + extensions/xml/package.json | 1 + extensions/yaml/package.json | 1 + .../browser/extensions.contribution.ts | 3 +- .../extensions/browser/extensionsViewlet.ts | 22 ++- .../extensions/browser/extensionsViews.ts | 160 ++++++++++-------- .../extensions/common/extensionQuery.ts | 16 +- .../test/common/extensionQuery.test.ts | 44 ++--- .../electron-sandbox/extensionsViews.test.ts | 10 +- 65 files changed, 198 insertions(+), 136 deletions(-) diff --git a/extensions/bat/package.json b/extensions/bat/package.json index f01e5d35ab2..2e654fe10a5 100644 --- a/extensions/bat/package.json +++ b/extensions/bat/package.json @@ -11,6 +11,7 @@ "scripts": { "update-grammar": "node ../node_modules/vscode-grammar-updater/bin mmims/language-batchfile grammars/batchfile.cson ./syntaxes/batchfile.tmLanguage.json" }, + "categories": ["Programming Languages"], "contributes": { "languages": [ { diff --git a/extensions/clojure/package.json b/extensions/clojure/package.json index 4c1dc3db8e9..730594c2ac5 100644 --- a/extensions/clojure/package.json +++ b/extensions/clojure/package.json @@ -11,6 +11,7 @@ "scripts": { "update-grammar": "node ../node_modules/vscode-grammar-updater/bin atom/language-clojure grammars/clojure.cson ./syntaxes/clojure.tmLanguage.json" }, + "categories": ["Programming Languages"], "contributes": { "languages": [ { diff --git a/extensions/coffeescript/package.json b/extensions/coffeescript/package.json index 61f89ecfee1..44f423c7dfc 100644 --- a/extensions/coffeescript/package.json +++ b/extensions/coffeescript/package.json @@ -11,6 +11,7 @@ "scripts": { "update-grammar": "node ../node_modules/vscode-grammar-updater/bin atom/language-coffee-script grammars/coffeescript.cson ./syntaxes/coffeescript.tmLanguage.json" }, + "categories": ["Programming Languages"], "contributes": { "languages": [ { diff --git a/extensions/cpp/package.json b/extensions/cpp/package.json index be5c8902ce5..c1d3f4882f6 100644 --- a/extensions/cpp/package.json +++ b/extensions/cpp/package.json @@ -11,6 +11,7 @@ "scripts": { "update-grammar": "node ./build/update-grammars.js" }, + "categories": ["Programming Languages"], "contributes": { "languages": [ { diff --git a/extensions/csharp/package.json b/extensions/csharp/package.json index 01d2de34e3e..c8af5a25f1f 100644 --- a/extensions/csharp/package.json +++ b/extensions/csharp/package.json @@ -11,6 +11,7 @@ "scripts": { "update-grammar": "node ../node_modules/vscode-grammar-updater/bin dotnet/csharp-tmLanguage grammars/csharp.tmLanguage ./syntaxes/csharp.tmLanguage.json" }, + "categories": ["Programming Languages"], "contributes": { "configurationDefaults": { "[csharp]": { diff --git a/extensions/css/package.json b/extensions/css/package.json index 3f2c9f95fcb..711c6f4a41a 100644 --- a/extensions/css/package.json +++ b/extensions/css/package.json @@ -11,6 +11,7 @@ "scripts": { "update-grammar": "node ../node_modules/vscode-grammar-updater/bin microsoft/vscode-css grammars/css.cson ./syntaxes/css.tmLanguage.json" }, + "categories": ["Programming Languages"], "contributes": { "languages": [ { diff --git a/extensions/dart/package.json b/extensions/dart/package.json index 92863ffb2b7..4aea7f98f50 100644 --- a/extensions/dart/package.json +++ b/extensions/dart/package.json @@ -8,9 +8,12 @@ "engines": { "vscode": "0.10.x" }, - "scripts": { - "update-grammar": "node ../node_modules/vscode-grammar-updater/bin dart-lang/dart-syntax-highlight grammars/dart.json ./syntaxes/dart.tmLanguage.json" - }, + "scripts": { + "update-grammar": "node ../node_modules/vscode-grammar-updater/bin dart-lang/dart-syntax-highlight grammars/dart.json ./syntaxes/dart.tmLanguage.json" + }, + "categories": [ + "Programming Languages" + ], "contributes": { "languages": [ { @@ -26,9 +29,9 @@ ], "grammars": [ { - "language": "dart", - "scopeName": "source.dart", - "path": "./syntaxes/dart.tmLanguage.json" + "language": "dart", + "scopeName": "source.dart", + "path": "./syntaxes/dart.tmLanguage.json" } ] } diff --git a/extensions/diff/package.json b/extensions/diff/package.json index 7d23e24ac6b..23047e3a534 100644 --- a/extensions/diff/package.json +++ b/extensions/diff/package.json @@ -11,6 +11,7 @@ "scripts": { "update-grammar": "node ../node_modules/vscode-grammar-updater/bin textmate/diff.tmbundle Syntaxes/Diff.plist ./syntaxes/diff.tmLanguage.json" }, + "categories": ["Programming Languages"], "contributes": { "languages": [ { diff --git a/extensions/docker/package.json b/extensions/docker/package.json index cdda622a22f..9309bd51f9f 100644 --- a/extensions/docker/package.json +++ b/extensions/docker/package.json @@ -11,6 +11,7 @@ "scripts": { "update-grammar": "node ../node_modules/vscode-grammar-updater/bin moby/moby contrib/syntax/textmate/Docker.tmbundle/Syntaxes/Dockerfile.tmLanguage ./syntaxes/docker.tmLanguage.json" }, + "categories": ["Programming Languages"], "contributes": { "languages": [ { diff --git a/extensions/fsharp/package.json b/extensions/fsharp/package.json index c88c1a7f194..1d05eb83de3 100644 --- a/extensions/fsharp/package.json +++ b/extensions/fsharp/package.json @@ -11,6 +11,7 @@ "scripts": { "update-grammar": "node ../node_modules/vscode-grammar-updater/bin ionide/ionide-fsgrammar grammars/fsharp.json ./syntaxes/fsharp.tmLanguage.json" }, + "categories": ["Programming Languages"], "contributes": { "languages": [ { diff --git a/extensions/go/package.json b/extensions/go/package.json index 02a6e32df76..ea0ca792148 100644 --- a/extensions/go/package.json +++ b/extensions/go/package.json @@ -11,6 +11,7 @@ "scripts": { "update-grammar": "node ../node_modules/vscode-grammar-updater/bin worlpaker/go-syntax syntaxes/go.tmLanguage.json ./syntaxes/go.tmLanguage.json" }, + "categories": ["Programming Languages"], "contributes": { "languages": [ { diff --git a/extensions/groovy/package.json b/extensions/groovy/package.json index 1f50ff6caf7..02e1138256f 100644 --- a/extensions/groovy/package.json +++ b/extensions/groovy/package.json @@ -11,6 +11,7 @@ "scripts": { "update-grammar": "node ../node_modules/vscode-grammar-updater/bin textmate/groovy.tmbundle Syntaxes/Groovy.tmLanguage ./syntaxes/groovy.tmLanguage.json" }, + "categories": ["Programming Languages"], "contributes": { "languages": [ { diff --git a/extensions/handlebars/package.json b/extensions/handlebars/package.json index 8e70493f3ca..7e6ecc1b113 100644 --- a/extensions/handlebars/package.json +++ b/extensions/handlebars/package.json @@ -11,6 +11,7 @@ "scripts": { "update-grammar": "node ../node_modules/vscode-grammar-updater/bin daaain/Handlebars grammars/Handlebars.json ./syntaxes/Handlebars.tmLanguage.json" }, + "categories": ["Programming Languages"], "extensionKind": [ "ui", "workspace" diff --git a/extensions/hlsl/package.json b/extensions/hlsl/package.json index 046ff9b31c8..ea60ab16483 100644 --- a/extensions/hlsl/package.json +++ b/extensions/hlsl/package.json @@ -11,6 +11,7 @@ "scripts": { "update-grammar": "node ../node_modules/vscode-grammar-updater/bin tgjones/shaders-tmLanguage grammars/hlsl.json ./syntaxes/hlsl.tmLanguage.json" }, + "categories": ["Programming Languages"], "contributes": { "languages": [ { diff --git a/extensions/html/package.json b/extensions/html/package.json index 238f1348955..098f9eae994 100644 --- a/extensions/html/package.json +++ b/extensions/html/package.json @@ -11,6 +11,7 @@ "scripts": { "update-grammar": "node ./build/update-grammar.mjs" }, + "categories": ["Programming Languages"], "contributes": { "languages": [ { diff --git a/extensions/ini/package.json b/extensions/ini/package.json index a8b332a74ec..3a594569546 100644 --- a/extensions/ini/package.json +++ b/extensions/ini/package.json @@ -12,6 +12,7 @@ "scripts": { "update-grammar": "node ../node_modules/vscode-grammar-updater/bin textmate/ini.tmbundle Syntaxes/Ini.plist ./syntaxes/ini.tmLanguage.json" }, + "categories": ["Programming Languages"], "contributes": { "languages": [ { diff --git a/extensions/java/package.json b/extensions/java/package.json index 6788ddd2133..2403b88bf9a 100644 --- a/extensions/java/package.json +++ b/extensions/java/package.json @@ -11,6 +11,7 @@ "scripts": { "update-grammar": "node ../node_modules/vscode-grammar-updater/bin redhat-developer/vscode-java language-support/java/java.tmLanguage.json ./syntaxes/java.tmLanguage.json" }, + "categories": ["Programming Languages"], "contributes": { "languages": [ { diff --git a/extensions/javascript/package.json b/extensions/javascript/package.json index 26e71b46d64..0b6b1c3cf76 100644 --- a/extensions/javascript/package.json +++ b/extensions/javascript/package.json @@ -8,6 +8,7 @@ "engines": { "vscode": "0.10.x" }, + "categories": ["Programming Languages"], "contributes": { "configurationDefaults": { "[javascript]": { diff --git a/extensions/json/package.json b/extensions/json/package.json index 7834eb38d75..8844345d672 100644 --- a/extensions/json/package.json +++ b/extensions/json/package.json @@ -11,6 +11,7 @@ "scripts": { "update-grammar": "node ./build/update-grammars.js" }, + "categories": ["Programming Languages"], "contributes": { "languages": [ { diff --git a/extensions/julia/package.json b/extensions/julia/package.json index 3c30069dce6..31cdd4ce71a 100644 --- a/extensions/julia/package.json +++ b/extensions/julia/package.json @@ -11,6 +11,7 @@ "scripts": { "update-grammar": "node ../node_modules/vscode-grammar-updater/bin JuliaEditorSupport/atom-language-julia grammars/julia_vscode.json ./syntaxes/julia.tmLanguage.json" }, + "categories": ["Programming Languages"], "contributes": { "languages": [ { diff --git a/extensions/latex/package.json b/extensions/latex/package.json index f7bacdbcd5b..73e1829f73f 100644 --- a/extensions/latex/package.json +++ b/extensions/latex/package.json @@ -11,6 +11,7 @@ "scripts": { "update-grammar": "node ./build/update-grammars.js" }, + "categories": ["Programming Languages"], "contributes": { "languages": [ { diff --git a/extensions/less/package.json b/extensions/less/package.json index 96301ba0fd1..5bd376312fa 100644 --- a/extensions/less/package.json +++ b/extensions/less/package.json @@ -11,6 +11,7 @@ "scripts": { "update-grammar": "node ./build/update-grammar.js" }, + "categories": ["Programming Languages"], "contributes": { "languages": [ { diff --git a/extensions/log/package.json b/extensions/log/package.json index 73093e1179a..d52c43afea7 100644 --- a/extensions/log/package.json +++ b/extensions/log/package.json @@ -11,6 +11,7 @@ "scripts": { "update-grammar": "node ../node_modules/vscode-grammar-updater/bin emilast/vscode-logfile-highlighter syntaxes/log.tmLanguage ./syntaxes/log.tmLanguage.json" }, + "categories": ["Programming Languages"], "contributes": { "languages": [ { diff --git a/extensions/lua/package.json b/extensions/lua/package.json index 20dba16c918..72c0840a9ea 100644 --- a/extensions/lua/package.json +++ b/extensions/lua/package.json @@ -11,6 +11,7 @@ "scripts": { "update-grammar": "node ../node_modules/vscode-grammar-updater/bin sumneko/lua.tmbundle Syntaxes/Lua.plist ./syntaxes/lua.tmLanguage.json" }, + "categories": ["Programming Languages"], "contributes": { "languages": [ { diff --git a/extensions/make/package.json b/extensions/make/package.json index 89a5134c64d..49e96cab1eb 100644 --- a/extensions/make/package.json +++ b/extensions/make/package.json @@ -11,6 +11,7 @@ "scripts": { "update-grammar": "node ../node_modules/vscode-grammar-updater/bin fadeevab/make.tmbundle Syntaxes/Makefile.plist ./syntaxes/make.tmLanguage.json" }, + "categories": ["Programming Languages"], "contributes": { "languages": [ { diff --git a/extensions/markdown-basics/package.json b/extensions/markdown-basics/package.json index 52588bbd362..6eadec35592 100644 --- a/extensions/markdown-basics/package.json +++ b/extensions/markdown-basics/package.json @@ -8,6 +8,7 @@ "engines": { "vscode": "^1.20.0" }, + "categories": ["Programming Languages"], "contributes": { "languages": [ { diff --git a/extensions/markdown-math/package.json b/extensions/markdown-math/package.json index 8947e89ed2f..85d09cbc9dc 100644 --- a/extensions/markdown-math/package.json +++ b/extensions/markdown-math/package.json @@ -11,7 +11,8 @@ "vscode": "^1.54.0" }, "categories": [ - "Other" + "Other", + "Programming Languages" ], "capabilities": { "virtualWorkspaces": true, diff --git a/extensions/objective-c/package.json b/extensions/objective-c/package.json index 91cc25be774..5339f7c42f9 100644 --- a/extensions/objective-c/package.json +++ b/extensions/objective-c/package.json @@ -11,6 +11,7 @@ "scripts": { "update-grammar": "node ./build/update-grammars.js" }, + "categories": ["Programming Languages"], "contributes": { "languages": [ { diff --git a/extensions/perl/package.json b/extensions/perl/package.json index 003ec922c32..1569e556146 100644 --- a/extensions/perl/package.json +++ b/extensions/perl/package.json @@ -11,6 +11,7 @@ "scripts": { "update-grammar": "node ../node_modules/vscode-grammar-updater/bin textmate/perl.tmbundle Syntaxes/Perl.plist ./syntaxes/perl.tmLanguage.json Syntaxes/Perl%206.tmLanguage ./syntaxes/perl6.tmLanguage.json" }, + "categories": ["Programming Languages"], "contributes": { "languages": [ { diff --git a/extensions/php/package.json b/extensions/php/package.json index 145431f9318..e38b844be65 100644 --- a/extensions/php/package.json +++ b/extensions/php/package.json @@ -8,6 +8,7 @@ "engines": { "vscode": "0.10.x" }, + "categories": ["Programming Languages"], "contributes": { "languages": [ { diff --git a/extensions/powershell/package.json b/extensions/powershell/package.json index 1097b2511ba..0fd7abd4149 100644 --- a/extensions/powershell/package.json +++ b/extensions/powershell/package.json @@ -8,6 +8,7 @@ "engines": { "vscode": "*" }, + "categories": ["Programming Languages"], "contributes": { "languages": [ { diff --git a/extensions/pug/package.json b/extensions/pug/package.json index 0d3c6b6eed8..cb77f60ba88 100644 --- a/extensions/pug/package.json +++ b/extensions/pug/package.json @@ -11,6 +11,7 @@ "scripts": { "update-grammar": "node ../node_modules/vscode-grammar-updater/bin davidrios/pug-tmbundle Syntaxes/Pug.JSON-tmLanguage ./syntaxes/pug.tmLanguage.json" }, + "categories": ["Programming Languages"], "contributes": { "languages": [ { diff --git a/extensions/python/package.json b/extensions/python/package.json index 332ff083c2b..543268de715 100644 --- a/extensions/python/package.json +++ b/extensions/python/package.json @@ -8,6 +8,7 @@ "engines": { "vscode": "*" }, + "categories": ["Programming Languages"], "contributes": { "languages": [ { diff --git a/extensions/r/package.json b/extensions/r/package.json index b78c30ce95e..fd1505e7b00 100644 --- a/extensions/r/package.json +++ b/extensions/r/package.json @@ -11,6 +11,7 @@ "scripts": { "update-grammar": "node ../node_modules/vscode-grammar-updater/bin REditorSupport/vscode-R syntax/r.json ./syntaxes/r.tmLanguage.json" }, + "categories": ["Programming Languages"], "contributes": { "languages": [ { diff --git a/extensions/razor/package.json b/extensions/razor/package.json index 2312ce86c48..06551edc8b9 100644 --- a/extensions/razor/package.json +++ b/extensions/razor/package.json @@ -11,6 +11,7 @@ "scripts": { "update-grammar": "node ./build/update-grammar.mjs" }, + "categories": ["Programming Languages"], "contributes": { "languages": [ { diff --git a/extensions/references-view/package.json b/extensions/references-view/package.json index a14e5a60ec0..228332773c6 100644 --- a/extensions/references-view/package.json +++ b/extensions/references-view/package.json @@ -22,9 +22,6 @@ "bugs": { "url": "https://github.com/Microsoft/vscode-references-view/issues" }, - "categories": [ - "Programming Languages" - ], "activationEvents": [ "onCommand:references-view.find", "onCommand:editor.action.showReferences" diff --git a/extensions/restructuredtext/package.json b/extensions/restructuredtext/package.json index 0fc722ed88c..4e74e6611ed 100644 --- a/extensions/restructuredtext/package.json +++ b/extensions/restructuredtext/package.json @@ -11,6 +11,7 @@ "scripts": { "update-grammar": "node ../node_modules/vscode-grammar-updater/bin trond-snekvik/vscode-rst syntaxes/rst.tmLanguage.json ./syntaxes/rst.tmLanguage.json" }, + "categories": ["Programming Languages"], "contributes": { "languages": [ { diff --git a/extensions/ruby/package.json b/extensions/ruby/package.json index 1ce625ef7c8..70dd99f26b5 100644 --- a/extensions/ruby/package.json +++ b/extensions/ruby/package.json @@ -11,6 +11,7 @@ "scripts": { "update-grammar": "node ../node_modules/vscode-grammar-updater/bin textmate/ruby.tmbundle Syntaxes/Ruby.plist ./syntaxes/ruby.tmLanguage.json" }, + "categories": ["Programming Languages"], "contributes": { "languages": [ { diff --git a/extensions/rust/package.json b/extensions/rust/package.json index a5485e3d473..34132cd15df 100644 --- a/extensions/rust/package.json +++ b/extensions/rust/package.json @@ -11,6 +11,7 @@ "scripts": { "update-grammar": "node ./build/update-grammar.mjs" }, + "categories": ["Programming Languages"], "contributes": { "languages": [ { diff --git a/extensions/scss/package.json b/extensions/scss/package.json index 967b790d9e5..19eed5e43c6 100644 --- a/extensions/scss/package.json +++ b/extensions/scss/package.json @@ -11,6 +11,7 @@ "scripts": { "update-grammar": "node ../node_modules/vscode-grammar-updater/bin atom/language-sass grammars/scss.cson ./syntaxes/scss.tmLanguage.json grammars/sassdoc.cson ./syntaxes/sassdoc.tmLanguage.json" }, + "categories": ["Programming Languages"], "contributes": { "languages": [ { diff --git a/extensions/search-result/package.json b/extensions/search-result/package.json index 747cde8e648..6582db3e782 100644 --- a/extensions/search-result/package.json +++ b/extensions/search-result/package.json @@ -9,9 +9,6 @@ "engines": { "vscode": "^1.39.0" }, - "categories": [ - "Programming Languages" - ], "main": "./out/extension.js", "browser": "./dist/extension.js", "activationEvents": [ diff --git a/extensions/shaderlab/package.json b/extensions/shaderlab/package.json index 7ffb311bea1..df6282b6fa9 100644 --- a/extensions/shaderlab/package.json +++ b/extensions/shaderlab/package.json @@ -11,6 +11,7 @@ "scripts": { "update-grammar": "node ../node_modules/vscode-grammar-updater/bin tgjones/shaders-tmLanguage grammars/shaderlab.json ./syntaxes/shaderlab.tmLanguage.json" }, + "categories": ["Programming Languages"], "contributes": { "languages": [ { diff --git a/extensions/shellscript/package.json b/extensions/shellscript/package.json index 72224868c2d..6f9e7072ab8 100644 --- a/extensions/shellscript/package.json +++ b/extensions/shellscript/package.json @@ -11,6 +11,7 @@ "scripts": { "update-grammar": "node ../node_modules/vscode-grammar-updater/bin jeff-hykin/better-shell-syntax autogenerated/shell.tmLanguage.json ./syntaxes/shell-unix-bash.tmLanguage.json" }, + "categories": ["Programming Languages"], "contributes": { "languages": [ { diff --git a/extensions/sql/package.json b/extensions/sql/package.json index 20e19ad8dd0..c048da78d1c 100644 --- a/extensions/sql/package.json +++ b/extensions/sql/package.json @@ -11,6 +11,7 @@ "scripts": { "update-grammar": "node ./build/update-grammar.mjs" }, + "categories": ["Programming Languages"], "contributes": { "languages": [ { diff --git a/extensions/swift/package.json b/extensions/swift/package.json index fd1a76cbadd..5effcf0c6fd 100644 --- a/extensions/swift/package.json +++ b/extensions/swift/package.json @@ -11,6 +11,7 @@ "scripts": { "update-grammar": "node ../node_modules/vscode-grammar-updater/bin jtbandes/swift-tmlanguage Swift.tmLanguage.json ./syntaxes/swift.tmLanguage.json" }, + "categories": ["Programming Languages"], "contributes": { "languages": [ { diff --git a/extensions/theme-abyss/package.json b/extensions/theme-abyss/package.json index 57183bf3d5e..3d3cf45c82a 100644 --- a/extensions/theme-abyss/package.json +++ b/extensions/theme-abyss/package.json @@ -8,6 +8,7 @@ "engines": { "vscode": "*" }, + "categories": ["Themes"], "contributes": { "themes": [ { diff --git a/extensions/theme-kimbie-dark/package.json b/extensions/theme-kimbie-dark/package.json index 7c186403adc..5c3ec5f7ad0 100644 --- a/extensions/theme-kimbie-dark/package.json +++ b/extensions/theme-kimbie-dark/package.json @@ -8,6 +8,7 @@ "engines": { "vscode": "*" }, + "categories": ["Themes"], "contributes": { "themes": [ { diff --git a/extensions/theme-monokai-dimmed/package.json b/extensions/theme-monokai-dimmed/package.json index 0c5b4f5fef8..bd6055e6b28 100644 --- a/extensions/theme-monokai-dimmed/package.json +++ b/extensions/theme-monokai-dimmed/package.json @@ -8,6 +8,7 @@ "engines": { "vscode": "*" }, + "categories": ["Themes"], "contributes": { "themes": [ { diff --git a/extensions/theme-monokai/package.json b/extensions/theme-monokai/package.json index b7cffe26a62..f2e63cd3494 100644 --- a/extensions/theme-monokai/package.json +++ b/extensions/theme-monokai/package.json @@ -8,6 +8,7 @@ "engines": { "vscode": "*" }, + "categories": ["Themes"], "contributes": { "themes": [ { diff --git a/extensions/theme-quietlight/package.json b/extensions/theme-quietlight/package.json index ea5387ba751..e27a8d30d65 100644 --- a/extensions/theme-quietlight/package.json +++ b/extensions/theme-quietlight/package.json @@ -8,6 +8,7 @@ "engines": { "vscode": "*" }, + "categories": ["Themes"], "contributes": { "themes": [ { diff --git a/extensions/theme-red/package.json b/extensions/theme-red/package.json index 176c78c22fb..c2273a0046d 100644 --- a/extensions/theme-red/package.json +++ b/extensions/theme-red/package.json @@ -8,6 +8,7 @@ "engines": { "vscode": "*" }, + "categories": ["Themes"], "contributes": { "themes": [ { diff --git a/extensions/theme-seti/package.json b/extensions/theme-seti/package.json index fd0dec2c8bf..fbc23ec6ee4 100644 --- a/extensions/theme-seti/package.json +++ b/extensions/theme-seti/package.json @@ -13,6 +13,7 @@ "engines": { "vscode": "*" }, + "categories": ["Themes"], "contributes": { "iconThemes": [ { diff --git a/extensions/theme-solarized-dark/package.json b/extensions/theme-solarized-dark/package.json index fee98f59466..c3eed2573d8 100644 --- a/extensions/theme-solarized-dark/package.json +++ b/extensions/theme-solarized-dark/package.json @@ -8,6 +8,7 @@ "engines": { "vscode": "*" }, + "categories": ["Themes"], "contributes": { "themes": [ { diff --git a/extensions/theme-solarized-light/package.json b/extensions/theme-solarized-light/package.json index 7efd642d58b..0d016de93dc 100644 --- a/extensions/theme-solarized-light/package.json +++ b/extensions/theme-solarized-light/package.json @@ -8,6 +8,7 @@ "engines": { "vscode": "*" }, + "categories": ["Themes"], "contributes": { "themes": [ { diff --git a/extensions/theme-tomorrow-night-blue/package.json b/extensions/theme-tomorrow-night-blue/package.json index a9a6405a947..8739e70c13f 100644 --- a/extensions/theme-tomorrow-night-blue/package.json +++ b/extensions/theme-tomorrow-night-blue/package.json @@ -8,6 +8,7 @@ "engines": { "vscode": "*" }, + "categories": ["Themes"], "contributes": { "themes": [ { diff --git a/extensions/typescript-basics/package.json b/extensions/typescript-basics/package.json index 63c07e75b6d..d765f6116f8 100644 --- a/extensions/typescript-basics/package.json +++ b/extensions/typescript-basics/package.json @@ -12,6 +12,7 @@ "scripts": { "update-grammar": "node ./build/update-grammars.mjs" }, + "categories": ["Programming Languages"], "contributes": { "languages": [ { diff --git a/extensions/vb/package.json b/extensions/vb/package.json index 6abf5ca5cc1..00665b071c3 100644 --- a/extensions/vb/package.json +++ b/extensions/vb/package.json @@ -11,6 +11,7 @@ "scripts": { "update-grammar": "node ../node_modules/vscode-grammar-updater/bin textmate/asp.vb.net.tmbundle Syntaxes/ASP%20VB.net.plist ./syntaxes/asp-vb-net.tmLanguage.json" }, + "categories": ["Programming Languages"], "contributes": { "languages": [ { diff --git a/extensions/xml/package.json b/extensions/xml/package.json index 36ccc2afc6e..60b0df42f65 100644 --- a/extensions/xml/package.json +++ b/extensions/xml/package.json @@ -8,6 +8,7 @@ "engines": { "vscode": "*" }, + "categories": ["Programming Languages"], "contributes": { "languages": [ { diff --git a/extensions/yaml/package.json b/extensions/yaml/package.json index 15739573f41..96e02e37da6 100644 --- a/extensions/yaml/package.json +++ b/extensions/yaml/package.json @@ -11,6 +11,7 @@ "scripts": { "update-grammar": "node ../node_modules/vscode-grammar-updater/bin textmate/yaml.tmbundle Syntaxes/YAML.tmLanguage ./syntaxes/yaml.tmLanguage.json" }, + "categories": ["Programming Languages"], "contributes": { "languages": [ { diff --git a/src/vs/workbench/contrib/extensions/browser/extensions.contribution.ts b/src/vs/workbench/contrib/extensions/browser/extensions.contribution.ts index bbcba568c68..b8f44f8df23 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensions.contribution.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensions.contribution.ts @@ -104,7 +104,6 @@ Registry.as(EditorExtensions.EditorPane).registerEditorPane new SyncDescriptor(ExtensionsInput) ]); - Registry.as(ViewContainerExtensions.ViewContainersRegistry).registerViewContainer( { id: VIEWLET_ID, @@ -1127,7 +1126,7 @@ class ExtensionsContributions extends Disposable implements IWorkbenchContributi const viewlet = await this.paneCompositeService.openPaneComposite(VIEWLET_ID, ViewContainerLocation.Sidebar, true); const extensionsViewPaneContainer = viewlet?.getViewPaneContainer() as IExtensionsViewPaneContainer; const currentQuery = Query.parse(extensionsViewPaneContainer.searchValue || ''); - extensionsViewPaneContainer.search(new Query(currentQuery.value, id, currentQuery.groupBy).toString()); + extensionsViewPaneContainer.search(new Query(currentQuery.value, id).toString()); extensionsViewPaneContainer.focus(); } }); diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsViewlet.ts b/src/vs/workbench/contrib/extensions/browser/extensionsViewlet.ts index 63d722516ec..55b42b4583c 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsViewlet.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsViewlet.ts @@ -21,7 +21,7 @@ import { InstallLocalExtensionsInRemoteAction, InstallRemoteExtensionsInLocalAct import { IExtensionManagementService } from 'vs/platform/extensionManagement/common/extensionManagement'; import { IWorkbenchExtensionEnablementService, IExtensionManagementServerService, IExtensionManagementServer } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; import { ExtensionsInput } from 'vs/workbench/contrib/extensions/common/extensionsInput'; -import { ExtensionsListView, EnabledExtensionsView, DisabledExtensionsView, RecommendedExtensionsView, WorkspaceRecommendedExtensionsView, BuiltInFeatureExtensionsView, BuiltInThemesExtensionsView, BuiltInProgrammingLanguageExtensionsView, ServerInstalledExtensionsView, DefaultRecommendedExtensionsView, UntrustedWorkspaceUnsupportedExtensionsView, UntrustedWorkspacePartiallySupportedExtensionsView, VirtualWorkspaceUnsupportedExtensionsView, VirtualWorkspacePartiallySupportedExtensionsView, DefaultPopularExtensionsView, DeprecatedExtensionsView, SearchMarketplaceExtensionsView, RecentlyUpdatedExtensionsView, OutdatedExtensionsView } from 'vs/workbench/contrib/extensions/browser/extensionsViews'; +import { ExtensionsListView, EnabledExtensionsView, DisabledExtensionsView, RecommendedExtensionsView, WorkspaceRecommendedExtensionsView, ServerInstalledExtensionsView, DefaultRecommendedExtensionsView, UntrustedWorkspaceUnsupportedExtensionsView, UntrustedWorkspacePartiallySupportedExtensionsView, VirtualWorkspaceUnsupportedExtensionsView, VirtualWorkspacePartiallySupportedExtensionsView, DefaultPopularExtensionsView, DeprecatedExtensionsView, SearchMarketplaceExtensionsView, RecentlyUpdatedExtensionsView, OutdatedExtensionsView, StaticQueryExtensionsView, NONE_CATEGORY } from 'vs/workbench/contrib/extensions/browser/extensionsViews'; import { IProgressService, ProgressLocation } from 'vs/platform/progress/common/progress'; import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import Severity from 'vs/base/common/severity'; @@ -42,7 +42,7 @@ import { ViewPane } from 'vs/workbench/browser/parts/views/viewPane'; import { Query } from 'vs/workbench/contrib/extensions/common/extensionQuery'; import { SuggestEnabledInput } from 'vs/workbench/contrib/codeEditor/browser/suggestEnabledInput/suggestEnabledInput'; import { alert } from 'vs/base/browser/ui/aria/aria'; -import { ExtensionType } from 'vs/platform/extensions/common/extensions'; +import { EXTENSION_CATEGORIES, ExtensionType } from 'vs/platform/extensions/common/extensions'; import { Registry } from 'vs/platform/registry/common/platform'; import { ILabelService } from 'vs/platform/label/common/label'; import { MementoObject } from 'vs/workbench/common/memento'; @@ -69,6 +69,7 @@ export const DefaultViewsContext = new RawContextKey('defaultExtensionV export const ExtensionsSortByContext = new RawContextKey('extensionsSortByValue', ''); export const SearchMarketplaceExtensionsContext = new RawContextKey('searchMarketplaceExtensions', false); export const SearchHasTextContext = new RawContextKey('extensionSearchHasText', false); +const InstalledExtensionsContext = new RawContextKey('installedExtensions', false); const SearchInstalledExtensionsContext = new RawContextKey('searchInstalledExtensions', false); const SearchRecentlyUpdatedExtensionsContext = new RawContextKey('searchRecentlyUpdatedExtensions', false); const SearchExtensionUpdatesContext = new RawContextKey('searchExtensionUpdates', false); @@ -301,7 +302,7 @@ export class ExtensionsViewletViewsContribution implements IWorkbenchContributio id: 'workbench.views.extensions.searchInstalled', name: localize2('installed', "Installed"), ctorDescriptor: new SyncDescriptor(ExtensionsListView, [{}]), - when: ContextKeyExpr.and(ContextKeyExpr.has('searchInstalledExtensions')), + when: ContextKeyExpr.or(ContextKeyExpr.has('searchInstalledExtensions'), ContextKeyExpr.has('installedExtensions')), }); /* @@ -394,24 +395,28 @@ export class ExtensionsViewletViewsContribution implements IWorkbenchContributio private createBuiltinExtensionsViewDescriptors(): IViewDescriptor[] { const viewDescriptors: IViewDescriptor[] = []; + const configuredCategories = ['themes', 'programming languages']; + const otherCategories = EXTENSION_CATEGORIES.filter(c => !configuredCategories.includes(c.toLowerCase())); + otherCategories.push(NONE_CATEGORY); + const otherCategoriesQuery = `${otherCategories.map(c => `category:"${c}"`).join(' ')} ${configuredCategories.map(c => `category:"-${c}"`).join(' ')}`; viewDescriptors.push({ id: 'workbench.views.extensions.builtinFeatureExtensions', name: localize2('builtinFeatureExtensions', "Features"), - ctorDescriptor: new SyncDescriptor(BuiltInFeatureExtensionsView, [{}]), + ctorDescriptor: new SyncDescriptor(StaticQueryExtensionsView, [{ query: `@builtin ${otherCategoriesQuery}` }]), when: ContextKeyExpr.has('builtInExtensions'), }); viewDescriptors.push({ id: 'workbench.views.extensions.builtinThemeExtensions', name: localize2('builtInThemesExtensions', "Themes"), - ctorDescriptor: new SyncDescriptor(BuiltInThemesExtensionsView, [{}]), + ctorDescriptor: new SyncDescriptor(StaticQueryExtensionsView, [{ query: `@builtin category:themes` }]), when: ContextKeyExpr.has('builtInExtensions'), }); viewDescriptors.push({ id: 'workbench.views.extensions.builtinProgrammingLanguageExtensions', name: localize2('builtinProgrammingLanguageExtensions', "Programming Languages"), - ctorDescriptor: new SyncDescriptor(BuiltInProgrammingLanguageExtensionsView, [{}]), + ctorDescriptor: new SyncDescriptor(StaticQueryExtensionsView, [{ query: `@builtin category:"programming languages"` }]), when: ContextKeyExpr.has('builtInExtensions'), }); @@ -474,6 +479,7 @@ export class ExtensionsViewPaneContainer extends ViewPaneContainer implements IE private searchMarketplaceExtensionsContextKey: IContextKey; private searchHasTextContextKey: IContextKey; private sortByUpdateDateContextKey: IContextKey; + private installedExtensionsContextKey: IContextKey; private searchInstalledExtensionsContextKey: IContextKey; private searchRecentlyUpdatedExtensionsContextKey: IContextKey; private searchExtensionUpdatesContextKey: IContextKey; @@ -521,6 +527,7 @@ export class ExtensionsViewPaneContainer extends ViewPaneContainer implements IE this.searchMarketplaceExtensionsContextKey = SearchMarketplaceExtensionsContext.bindTo(contextKeyService); this.searchHasTextContextKey = SearchHasTextContext.bindTo(contextKeyService); this.sortByUpdateDateContextKey = SortByUpdateDateContext.bindTo(contextKeyService); + this.installedExtensionsContextKey = InstalledExtensionsContext.bindTo(contextKeyService); this.searchInstalledExtensionsContextKey = SearchInstalledExtensionsContext.bindTo(contextKeyService); this.searchRecentlyUpdatedExtensionsContextKey = SearchRecentlyUpdatedExtensionsContext.bindTo(contextKeyService); this.searchExtensionUpdatesContextKey = SearchExtensionUpdatesContext.bindTo(contextKeyService); @@ -713,7 +720,8 @@ export class ExtensionsViewPaneContainer extends ViewPaneContainer implements IE this.contextKeyService.bufferChangeEvents(() => { const isRecommendedExtensionsQuery = ExtensionsListView.isRecommendedExtensionsQuery(value); this.searchHasTextContextKey.set(value.trim() !== ''); - this.searchInstalledExtensionsContextKey.set(ExtensionsListView.isInstalledExtensionsQuery(value)); + this.installedExtensionsContextKey.set(ExtensionsListView.isInstalledExtensionsQuery(value)); + this.searchInstalledExtensionsContextKey.set(ExtensionsListView.isSearchInstalledExtensionsQuery(value)); this.searchRecentlyUpdatedExtensionsContextKey.set(ExtensionsListView.isSearchRecentlyUpdatedQuery(value) && !ExtensionsListView.isSearchExtensionUpdatesQuery(value)); this.searchOutdatedExtensionsContextKey.set(ExtensionsListView.isOutdatedExtensionsQuery(value) && !ExtensionsListView.isSearchExtensionUpdatesQuery(value)); this.searchExtensionUpdatesContextKey.set(ExtensionsListView.isSearchExtensionUpdatesQuery(value)); diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsViews.ts b/src/vs/workbench/contrib/extensions/browser/extensionsViews.ts index 64d33c31756..db5a0672ed9 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsViews.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsViews.ts @@ -56,8 +56,7 @@ import { ILogService } from 'vs/platform/log/common/log'; import { isOfflineError } from 'vs/base/parts/request/common/request'; import { defaultCountBadgeStyles } from 'vs/platform/theme/browser/defaultStyles'; -// Extensions that are automatically classified as Programming Language extensions, but should be Feature extensions -const FORCE_FEATURE_EXTENSIONS = ['vscode.git', 'vscode.git-base', 'vscode.search-result']; +export const NONE_CATEGORY = 'none'; class ExtensionsViewState extends Disposable implements IExtensionsViewState { @@ -447,74 +446,56 @@ export class ExtensionsListView extends ViewPane { } private filterBuiltinExtensions(local: IExtension[], query: Query, options: IQueryOptions): IExtension[] { - let value = query.value; - const showThemesOnly = /@builtin:themes/i.test(value); - if (showThemesOnly) { - value = value.replace(/@builtin:themes/g, ''); - } - const showBasicsOnly = /@builtin:basics/i.test(value); - if (showBasicsOnly) { - value = value.replace(/@builtin:basics/g, ''); - } - const showFeaturesOnly = /@builtin:features/i.test(value); - if (showFeaturesOnly) { - value = value.replace(/@builtin:features/g, ''); - } - + let { value, includedCategories, excludedCategories } = this.parseCategories(query.value); value = value.replace(/@builtin/g, '').replace(/@sort:(\w+)(-\w*)?/g, '').trim().toLowerCase(); const result = local - .filter(e => e.isBuiltin && (e.name.toLowerCase().indexOf(value) > -1 || e.displayName.toLowerCase().indexOf(value) > -1)); - - const isThemeExtension = (e: IExtension): boolean => { - return (Array.isArray(e.local?.manifest?.contributes?.themes) && e.local!.manifest!.contributes!.themes.length > 0) - || (Array.isArray(e.local?.manifest?.contributes?.iconThemes) && e.local!.manifest!.contributes!.iconThemes.length > 0); - }; - if (showThemesOnly) { - const themesExtensions = result.filter(isThemeExtension); - return this.sortExtensions(themesExtensions, options); - } - - const isLanguageBasicExtension = (e: IExtension): boolean => { - return FORCE_FEATURE_EXTENSIONS.indexOf(e.identifier.id) === -1 - && (Array.isArray(e.local?.manifest?.contributes?.grammars) && e.local!.manifest!.contributes!.grammars.length > 0); - }; - if (showBasicsOnly) { - const basics = result.filter(isLanguageBasicExtension); - return this.sortExtensions(basics, options); - } - if (showFeaturesOnly) { - const others = result.filter(e => { - return e.local - && e.local.manifest - && !isThemeExtension(e) - && !isLanguageBasicExtension(e); - }); - return this.sortExtensions(others, options); - } + .filter(e => e.isBuiltin && (e.name.toLowerCase().indexOf(value) > -1 || e.displayName.toLowerCase().indexOf(value) > -1) + && this.filterExtensionByCategory(e, includedCategories, excludedCategories)); return this.sortExtensions(result, options); } - private parseCategories(value: string): { value: string; categories: string[] } { - const categories: string[] = []; + private filterExtensionByCategory(e: IExtension, includedCategories: string[], excludedCategories: string[]): boolean { + if (!includedCategories.length && !excludedCategories.length) { + return true; + } + if (e.categories.length) { + if (excludedCategories.length && e.categories.some(category => excludedCategories.includes(category.toLowerCase()))) { + return false; + } + return e.categories.some(category => includedCategories.includes(category.toLowerCase())); + } else { + return includedCategories.includes(NONE_CATEGORY); + } + } + + private parseCategories(value: string): { value: string; includedCategories: string[]; excludedCategories: string[] } { + const includedCategories: string[] = []; + const excludedCategories: string[] = []; value = value.replace(/\bcategory:("([^"]*)"|([^"]\S*))(\s+|\b|$)/g, (_, quotedCategory, category) => { const entry = (category || quotedCategory || '').toLowerCase(); - if (categories.indexOf(entry) === -1) { - categories.push(entry); + if (entry.startsWith('-')) { + if (excludedCategories.indexOf(entry) === -1) { + excludedCategories.push(entry); + } + } else { + if (includedCategories.indexOf(entry) === -1) { + includedCategories.push(entry); + } } return ''; }); - return { value, categories }; + return { value, includedCategories, excludedCategories }; } private filterInstalledExtensions(local: IExtension[], runningExtensions: readonly IExtensionDescription[], query: Query, options: IQueryOptions): IExtension[] { - let { value, categories } = this.parseCategories(query.value); + let { value, includedCategories, excludedCategories } = this.parseCategories(query.value); value = value.replace(/@installed/g, '').replace(/@sort:(\w+)(-\w*)?/g, '').trim().toLowerCase(); const matchingText = (e: IExtension) => (e.name.toLowerCase().indexOf(value) > -1 || e.displayName.toLowerCase().indexOf(value) > -1 || e.description.toLowerCase().indexOf(value) > -1) - && (!categories.length || categories.some(category => (e.local && e.local.manifest.categories || []).some(c => c.toLowerCase() === category))); + && this.filterExtensionByCategory(e, includedCategories, excludedCategories); let result; if (options.sortBy !== undefined) { @@ -570,7 +551,7 @@ export class ExtensionsListView extends ViewPane { } private filterOutdatedExtensions(local: IExtension[], query: Query, options: IQueryOptions): IExtension[] { - let { value, categories } = this.parseCategories(query.value); + let { value, includedCategories, excludedCategories } = this.parseCategories(query.value); value = value.replace(/@outdated/g, '').replace(/@sort:(\w+)(-\w*)?/g, '').trim().toLowerCase(); @@ -578,13 +559,13 @@ export class ExtensionsListView extends ViewPane { .sort((e1, e2) => e1.displayName.localeCompare(e2.displayName)) .filter(extension => extension.outdated && (extension.name.toLowerCase().indexOf(value) > -1 || extension.displayName.toLowerCase().indexOf(value) > -1) - && (!categories.length || categories.some(category => !!extension.local && extension.local.manifest.categories!.some(c => c.toLowerCase() === category)))); + && this.filterExtensionByCategory(extension, includedCategories, excludedCategories)); return this.sortExtensions(result, options); } private filterDisabledExtensions(local: IExtension[], runningExtensions: readonly IExtensionDescription[], query: Query, options: IQueryOptions): IExtension[] { - let { value, categories } = this.parseCategories(query.value); + let { value, includedCategories, excludedCategories } = this.parseCategories(query.value); value = value.replace(/@disabled/g, '').replace(/@sort:(\w+)(-\w*)?/g, '').trim().toLowerCase(); @@ -592,13 +573,13 @@ export class ExtensionsListView extends ViewPane { .sort((e1, e2) => e1.displayName.localeCompare(e2.displayName)) .filter(e => runningExtensions.every(r => !areSameExtensions({ id: r.identifier.value, uuid: r.uuid }, e.identifier)) && (e.name.toLowerCase().indexOf(value) > -1 || e.displayName.toLowerCase().indexOf(value) > -1) - && (!categories.length || categories.some(category => (e.local && e.local.manifest.categories || []).some(c => c.toLowerCase() === category)))); + && this.filterExtensionByCategory(e, includedCategories, excludedCategories)); return this.sortExtensions(result, options); } private filterEnabledExtensions(local: IExtension[], runningExtensions: readonly IExtensionDescription[], query: Query, options: IQueryOptions): IExtension[] { - let { value, categories } = this.parseCategories(query.value); + let { value, includedCategories, excludedCategories } = this.parseCategories(query.value); value = value ? value.replace(/@enabled/g, '').replace(/@sort:(\w+)(-\w*)?/g, '').trim().toLowerCase() : ''; @@ -607,7 +588,7 @@ export class ExtensionsListView extends ViewPane { .sort((e1, e2) => e1.displayName.localeCompare(e2.displayName)) .filter(e => runningExtensions.some(r => areSameExtensions({ id: r.identifier.value, uuid: r.uuid }, e.identifier)) && (e.name.toLowerCase().indexOf(value) > -1 || e.displayName.toLowerCase().indexOf(value) > -1) - && (!categories.length || categories.some(category => (e.local && e.local.manifest.categories || []).some(c => c.toLowerCase() === category)))); + && this.filterExtensionByCategory(e, includedCategories, excludedCategories)); return this.sortExtensions(result, options); } @@ -681,15 +662,15 @@ export class ExtensionsListView extends ViewPane { } private filterRecentlyUpdatedExtensions(local: IExtension[], query: Query, options: IQueryOptions): IExtension[] { - let { value, categories } = this.parseCategories(query.value); + let { value, includedCategories, excludedCategories } = this.parseCategories(query.value); const currentTime = Date.now(); local = local.filter(e => !e.isBuiltin && !e.outdated && e.local?.updated && e.local?.installedTimestamp !== undefined && currentTime - e.local.installedTimestamp < ExtensionsListView.RECENT_UPDATE_DURATION); value = value.replace(/@recentlyUpdated/g, '').replace(/@sort:(\w+)(-\w*)?/g, '').trim().toLowerCase(); const result = local.filter(e => - (e.name.toLowerCase().indexOf(value) > -1 || e.displayName.toLowerCase().indexOf(value) > -1) && - (!categories.length || categories.some(category => (e.local && e.local.manifest.categories || []).some(c => c.toLowerCase() === category)))); + (e.name.toLowerCase().indexOf(value) > -1 || e.displayName.toLowerCase().indexOf(value) > -1) + && this.filterExtensionByCategory(e, includedCategories, excludedCategories)); options.sortBy = options.sortBy ?? LocalSortBy.UpdateDate; @@ -1082,6 +1063,7 @@ export class ExtensionsListView extends ViewPane { static isLocalExtensionsQuery(query: string, sortBy?: string): boolean { return this.isInstalledExtensionsQuery(query) + || this.isSearchInstalledExtensionsQuery(query) || this.isOutdatedExtensionsQuery(query) || this.isEnabledExtensionsQuery(query) || this.isDisabledExtensionsQuery(query) @@ -1112,7 +1094,11 @@ export class ExtensionsListView extends ViewPane { } static isInstalledExtensionsQuery(query: string): boolean { - return /@installed/i.test(query); + return /@installed$/i.test(query); + } + + static isSearchInstalledExtensionsQuery(query: string): boolean { + return /@installed\s./i.test(query); } static isOutdatedExtensionsQuery(query: string): boolean { @@ -1262,21 +1248,49 @@ export class RecentlyUpdatedExtensionsView extends ExtensionsListView { } -export class BuiltInFeatureExtensionsView extends ExtensionsListView { - override async show(query: string): Promise> { - return (query && query.trim() !== '@builtin') ? this.showEmptyModel() : super.show('@builtin:features'); - } +export interface StaticQueryExtensionsViewOptions extends ExtensionsListViewOptions { + readonly query: string; } -export class BuiltInThemesExtensionsView extends ExtensionsListView { - override async show(query: string): Promise> { - return (query && query.trim() !== '@builtin') ? this.showEmptyModel() : super.show('@builtin:themes'); - } -} +export class StaticQueryExtensionsView extends ExtensionsListView { -export class BuiltInProgrammingLanguageExtensionsView extends ExtensionsListView { - override async show(query: string): Promise> { - return (query && query.trim() !== '@builtin') ? this.showEmptyModel() : super.show('@builtin:basics'); + constructor( + protected override readonly options: StaticQueryExtensionsViewOptions, + viewletViewOptions: IViewletViewOptions, + @INotificationService notificationService: INotificationService, + @IKeybindingService keybindingService: IKeybindingService, + @IContextMenuService contextMenuService: IContextMenuService, + @IInstantiationService instantiationService: IInstantiationService, + @IThemeService themeService: IThemeService, + @IExtensionService extensionService: IExtensionService, + @IExtensionsWorkbenchService extensionsWorkbenchService: IExtensionsWorkbenchService, + @IExtensionRecommendationsService extensionRecommendationsService: IExtensionRecommendationsService, + @ITelemetryService telemetryService: ITelemetryService, + @IConfigurationService configurationService: IConfigurationService, + @IWorkspaceContextService contextService: IWorkspaceContextService, + @IExtensionManagementServerService extensionManagementServerService: IExtensionManagementServerService, + @IExtensionManifestPropertiesService extensionManifestPropertiesService: IExtensionManifestPropertiesService, + @IWorkbenchExtensionManagementService extensionManagementService: IWorkbenchExtensionManagementService, + @IWorkspaceContextService workspaceService: IWorkspaceContextService, + @IProductService productService: IProductService, + @IContextKeyService contextKeyService: IContextKeyService, + @IViewDescriptorService viewDescriptorService: IViewDescriptorService, + @IOpenerService openerService: IOpenerService, + @IPreferencesService preferencesService: IPreferencesService, + @IStorageService storageService: IStorageService, + @IWorkspaceTrustManagementService workspaceTrustManagementService: IWorkspaceTrustManagementService, + @IWorkbenchExtensionEnablementService extensionEnablementService: IWorkbenchExtensionEnablementService, + @IWorkbenchLayoutService layoutService: IWorkbenchLayoutService, + @ILogService logService: ILogService + ) { + super(options, viewletViewOptions, notificationService, keybindingService, contextMenuService, instantiationService, themeService, extensionService, + extensionsWorkbenchService, extensionRecommendationsService, telemetryService, configurationService, contextService, extensionManagementServerService, + extensionManifestPropertiesService, extensionManagementService, workspaceService, productService, contextKeyService, viewDescriptorService, openerService, + preferencesService, storageService, workspaceTrustManagementService, extensionEnablementService, layoutService, logService); + } + + override show(): Promise> { + return super.show(this.options.query); } } diff --git a/src/vs/workbench/contrib/extensions/common/extensionQuery.ts b/src/vs/workbench/contrib/extensions/common/extensionQuery.ts index d8e5ef9385b..b74676a210f 100644 --- a/src/vs/workbench/contrib/extensions/common/extensionQuery.ts +++ b/src/vs/workbench/contrib/extensions/common/extensionQuery.ts @@ -8,7 +8,7 @@ import { EXTENSION_CATEGORIES } from 'vs/platform/extensions/common/extensions'; export class Query { - constructor(public value: string, public sortBy: string, public groupBy: string) { + constructor(public value: string, public sortBy: string) { this.value = value.trim(); } @@ -48,15 +48,7 @@ export class Query { return ''; }); - - let groupBy = ''; - value = value.replace(/@group:(\w+)(-\w*)?/g, (match, by: string, order: string) => { - groupBy = by; - - return ''; - }); - - return new Query(value, sortBy, groupBy); + return new Query(value, sortBy); } toString(): string { @@ -65,10 +57,6 @@ export class Query { if (this.sortBy) { result = `${result}${result ? ' ' : ''}@sort:${this.sortBy}`; } - if (this.groupBy) { - result = `${result}${result ? ' ' : ''}@group:${this.groupBy}`; - } - return result; } diff --git a/src/vs/workbench/contrib/extensions/test/common/extensionQuery.test.ts b/src/vs/workbench/contrib/extensions/test/common/extensionQuery.test.ts index 53a83c27df2..a743e9e184e 100644 --- a/src/vs/workbench/contrib/extensions/test/common/extensionQuery.test.ts +++ b/src/vs/workbench/contrib/extensions/test/common/extensionQuery.test.ts @@ -70,72 +70,72 @@ suite('Extension query', () => { }); test('toString', () => { - let query = new Query('hello', '', ''); + let query = new Query('hello', ''); assert.strictEqual(query.toString(), 'hello'); - query = new Query('hello world', '', ''); + query = new Query('hello world', ''); assert.strictEqual(query.toString(), 'hello world'); - query = new Query(' hello ', '', ''); + query = new Query(' hello ', ''); assert.strictEqual(query.toString(), 'hello'); - query = new Query('', 'installs', ''); + query = new Query('', 'installs'); assert.strictEqual(query.toString(), '@sort:installs'); - query = new Query('', 'installs', ''); + query = new Query('', 'installs'); assert.strictEqual(query.toString(), '@sort:installs'); - query = new Query('', 'installs', ''); + query = new Query('', 'installs'); assert.strictEqual(query.toString(), '@sort:installs'); - query = new Query('hello', 'installs', ''); + query = new Query('hello', 'installs'); assert.strictEqual(query.toString(), 'hello @sort:installs'); - query = new Query(' hello ', 'installs', ''); + query = new Query(' hello ', 'installs'); assert.strictEqual(query.toString(), 'hello @sort:installs'); }); test('isValid', () => { - let query = new Query('hello', '', ''); + let query = new Query('hello', ''); assert(query.isValid()); - query = new Query('hello world', '', ''); + query = new Query('hello world', ''); assert(query.isValid()); - query = new Query(' hello ', '', ''); + query = new Query(' hello ', ''); assert(query.isValid()); - query = new Query('', 'installs', ''); + query = new Query('', 'installs'); assert(query.isValid()); - query = new Query('', 'installs', ''); + query = new Query('', 'installs'); assert(query.isValid()); - query = new Query('', 'installs', ''); + query = new Query('', 'installs'); assert(query.isValid()); - query = new Query('', 'installs', ''); + query = new Query('', 'installs'); assert(query.isValid()); - query = new Query('hello', 'installs', ''); + query = new Query('hello', 'installs'); assert(query.isValid()); - query = new Query(' hello ', 'installs', ''); + query = new Query(' hello ', 'installs'); assert(query.isValid()); }); test('equals', () => { - const query1 = new Query('hello', '', ''); - let query2 = new Query('hello', '', ''); + const query1 = new Query('hello', ''); + let query2 = new Query('hello', ''); assert(query1.equals(query2)); - query2 = new Query('hello world', '', ''); + query2 = new Query('hello world', ''); assert(!query1.equals(query2)); - query2 = new Query('hello', 'installs', ''); + query2 = new Query('hello', 'installs'); assert(!query1.equals(query2)); - query2 = new Query('hello', 'installs', ''); + query2 = new Query('hello', 'installs'); assert(!query1.equals(query2)); }); diff --git a/src/vs/workbench/contrib/extensions/test/electron-sandbox/extensionsViews.test.ts b/src/vs/workbench/contrib/extensions/test/electron-sandbox/extensionsViews.test.ts index 1d07a03c712..4a06d92c0e8 100644 --- a/src/vs/workbench/contrib/extensions/test/electron-sandbox/extensionsViews.test.ts +++ b/src/vs/workbench/contrib/extensions/test/electron-sandbox/extensionsViews.test.ts @@ -61,8 +61,8 @@ suite('ExtensionsViews Tests', () => { const localDisabledTheme = aLocalExtension('first-disabled-extension', { categories: ['themes'] }, { installedTimestamp: 234567 }); const localDisabledLanguage = aLocalExtension('second-disabled-extension', { categories: ['programming languages'] }, { installedTimestamp: Date.now() - 50000, updated: true }); const localRandom = aLocalExtension('random-enabled-extension', { categories: ['random'] }, { installedTimestamp: 345678 }); - const builtInTheme = aLocalExtension('my-theme', { contributes: { themes: ['my-theme'] } }, { type: ExtensionType.System, installedTimestamp: 222 }); - const builtInBasic = aLocalExtension('my-lang', { contributes: { grammars: [{ language: 'my-language' }] } }, { type: ExtensionType.System, installedTimestamp: 666666 }); + const builtInTheme = aLocalExtension('my-theme', { categories: ['Themes'], contributes: { themes: ['my-theme'] } }, { type: ExtensionType.System, installedTimestamp: 222 }); + const builtInBasic = aLocalExtension('my-lang', { categories: ['Programming Languages'], contributes: { grammars: [{ language: 'my-language' }] } }, { type: ExtensionType.System, installedTimestamp: 666666 }); const galleryEnabledLanguage = aGalleryExtension(localEnabledLanguage.manifest.name, { ...localEnabledLanguage.manifest, version: '1.0.1', identifier: localDisabledLanguage.identifier }); @@ -286,12 +286,12 @@ suite('ExtensionsViews Tests', () => { assert.strictEqual(result.get(2).name, localEnabledLanguage.manifest.name, 'Unexpected extension for @enabled query.'); }); - await testableView.show('@builtin:themes').then(result => { - assert.strictEqual(result.length, 1, 'Unexpected number of results for @builtin:themes query'); + await testableView.show('@builtin category:themes').then(result => { + assert.strictEqual(result.length, 1, 'Unexpected number of results for @builtin category:themes query'); assert.strictEqual(result.get(0).name, builtInTheme.manifest.name, 'Unexpected extension for @builtin:themes query.'); }); - await testableView.show('@builtin:basics').then(result => { + await testableView.show('@builtin category:"programming languages"').then(result => { assert.strictEqual(result.length, 1, 'Unexpected number of results for @builtin:basics query'); assert.strictEqual(result.get(0).name, builtInBasic.manifest.name, 'Unexpected extension for @builtin:basics query.'); });